Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何将具有行的记录与其他行进行比较?_Sql_Sql Server - Fatal编程技术网

Sql 如何将具有行的记录与其他行进行比较?

Sql 如何将具有行的记录与其他行进行比较?,sql,sql-server,Sql,Sql Server,我有第一个包含列的表: 1. id 2. key 3. value 第二张表(更像列表): 我需要获得包含第二个表中所有键的不同id 我已经尝试过自动加入,但速度很慢。我还尝试了COUNT=COUNT,但性能相同 自连接: 从第一个字段中选择f.id 连接f.id=f2.id和f2.key=f上的第一个f2。钥匙 计数: 从@a a中选择a.keyfrom 其中(从[b]b中选择SUM(当k.[key]不为NULL时为1,否则为0结束) 左键连接第二个s。键=b。[键] 其

我有第一个包含列的表:

   1. id
   2. key
   3. value
第二张表(更像列表):

我需要获得包含第二个表中所有键的不同id

我已经尝试过自动加入,但速度很慢。我还尝试了COUNT=COUNT,但性能相同

自连接:

从第一个字段中选择f.id
连接f.id=f2.id和f2.key=f上的第一个f2。钥匙
计数:

从@a a中选择a.keyfrom
其中(从[b]b中选择SUM(当k.[key]不为NULL时为1,否则为0结束)
左键连接第二个s。键=b。[键]
其中b.[Key]=a.Key)=@KeyCount

这有点像是暗中捅了一刀,但也许这就是你想要的

SELECT I.ID
FROM TableB B
     CROSS APPLY (SELECT DISTINCT ca.ID
                  FROM dbo.TableA ca) I
     LEFT JOIN TableA A ON B.[key] = A.[key]
                       AND I.ID = A.ID
GROUP BY I.ID
HAVING COUNT(CASE WHEN A.[Key] IS NULL THEN 1 END) = 0;
假设:

  • 第二个表列出了所有可能的键,以及
  • 第一个表(包含实体ID、键和键值)只能包含1个实体键组合
类似的方法可能会奏效:

SELECT [id], COUNT(*)
FROM Table1
GROUP BY [id]
HAVING COUNT(*) = (SELECT COUNT(*) FROM keys)
现在使用一些示例数据。假设以下关键点:

+--------+----------+
| key_id | key_name |
+--------+----------+
|      1 | Key1     |
|      2 | Key2     |
|      3 | Key3     |
+--------+----------+
以及下列实体:

+----+-----+-------+
| id | key | value |
+----+-----+-------+
|  1 |   1 |     1 |
|  1 |   2 |     2 |
|  1 |   3 |     3 |
|  2 |   2 |     2 |
|  2 |   3 |     3 |
+----+-----+-------+

假设实体1具有所有键,但实体2缺少键1。因此,正如预期的那样,查询只返回实体1。

您可以使用聚合进行计数:

select f.id
from first f
where exists (select 1 from second s where s.key = f.key)
group by f.id
having count(*) = (select count(*) from second);
这假定表中没有重复项。它还假设
第一个
中的额外键正常。如果没有,请使用左联接:

select f.id
from first f left join
     second s
     on s.key = f.key
group by f.id
having count(s.key) = (select count(*) from second) and
       count(*) = count(s.key);

你也可以检查这个-

SELECT A.id
FROM TAB1 A
INNER JOIN TAB2 B ON A.[key] = B.[Key]
GROUP BY A.id
HAVING COUNT(DISTINCT A.[key]) 
    = (SELECT COUNT(DISTINCT [Key]) FROM TAB2)

示例数据和预期结果将对我们有很大帮助。因此,您的第二个表列出了表1中实体可能拥有的所有可能的键?如果您的查询示例能够编译,这会有所帮助,但遗憾的是,两者都没有。是的,这是可行的,但我忘了提到键具有重复项的情况。你的案子解决了我的问题。不客气。
SELECT A.id
FROM TAB1 A
INNER JOIN TAB2 B ON A.[key] = B.[Key]
GROUP BY A.id
HAVING COUNT(DISTINCT A.[key]) 
    = (SELECT COUNT(DISTINCT [Key]) FROM TAB2)