加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

sql-server – 在多个集合中查找一个匹配集

发布时间:2020-12-12 07:08:13 所属栏目:MsSql教程 来源:网络整理
导读:我有一个包含许多集合的表(@ t1).我想在@ t1中找到@ t2的完美匹配. 在此示例中,所需结果为1. (第1组完全匹配,第2组包含3个元素,而@ t2只包含2个元素,第3组包含的元素少于@ t2,第4组包含@ t2中不允许的NULL元素,第5组包含正确数量的元素但其中一个要素不相等.)
我有一个包含许多集合的表(@ t1).我想在@ t1中找到@ t2的完美匹配.

在此示例中,所需结果为1.

(第1组完全匹配,第2组包含3个元素,而@ t2只包含2个元素,第3组包含的元素少于@ t2,第4组包含@ t2中不允许的NULL元素,第5组包含正确数量的元素但其中一个要素不相等.)

DECLARE @t1 TABLE (id INT,data INT);
DECLARE @t2 TABLE (data INT PRIMARY KEY);

INSERT INTO @t1 (id,data)
VALUES
(1,1),(1,2),(2,3),(3,(4,NULL),(5,3);

INSERT @t2 (data)
VALUES
(1),(2);

我有一个查询可能正在完成工作,但它看起来有点可怜我也.

WITH t1 AS
(
    SELECT id,data
    FROM @t1
    WHERE data IS NOT NULL
),t1_count AS
(
    SELECT id,RCount = COUNT(*)
    FROM @t1
    WHERE data IS NOT NULL
    GROUP BY id
)
SELECT t1.id
FROM t1
JOIN t1_count ON t1.id = t1_count.id
FULL JOIN @t2 t2 ON t1.data = t2.data
WHERE t1_count.RCount = (SELECT RCount = COUNT(*) FROM @t2)
GROUP BY t1.id
HAVING COUNT(t1.data) = COUNT(t2.data);

编辑(GarethD的评论):

WITH t1 AS
(
    SELECT
        id,data,RCount = COUNT(*) OVER(PARTITION BY id)
    FROM @t1
    WHERE data IS NOT NULL
)
SELECT t1.id
FROM t1
FULL JOIN @t2 t2 ON t1.data = t2.data
WHERE t1.RCount = (SELECT RCount = COUNT(*) FROM @t2)
GROUP BY t1.id
HAVING COUNT(t1.data) = COUNT(t2.data);

解决方法

你想要的是Exact Relational Division.不幸的是,SQL Server没有本机操作符,但它是一个记录良好的问题.一个可能的解决方案(从 an article by Joe Celko获取的想法)是比较计数,类似于您已经在做的事情:
SELECT t1.id
  FROM @t1 AS t1 LEFT JOIN @t2 AS t2 ON t1.data = t2.data
 GROUP BY t1.id
HAVING COUNT(t1.data) = (SELECT COUNT(data) FROM @t2)
   AND COUNT(t2.data) = (SELECT COUNT(data) FROM @t2);

请注意,两次HAVING比较都是必要的:

>第一个确保t1具有所需的行数和>第二个确保这些行只包含来自t2的值(否则,t2.data将通过LEFT JOIN为NULL.回想一下,COUNT(x)只计算x的非空值).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读