通过比较子集选择记录

dev*_*ull 4 sql sql-server-2005

给定两个表(每个表中的行是不同的):

 1)  x | y     z   2)  x | y     z
    -------   ---     -------   ---
     1 | a     a       1 | a     a
     1 | b     b       1 | b     b
     2 | a             1 | c
     2 | b             2 | a
     2 | c             2 | b
                       2 | c
Run Code Online (Sandbox Code Playgroud)

有没有办法在选择值x的第一表,其在值的子集的列y柱,对于x在精确匹配值z的第二个表的列?

如果1)预期的结果是1.如果c添加到第二个表,则预期结果为2.
在这种情况下2),预期结果是no record因为第一个表中的子集都不匹配第二个表中的子集.如果c添加到第二个表,则预期结果为1, 2.

我已经尝试使用exceptintersect比较第一个表的子集和第二个表,它工作正常,但它需要太长的intersect部分,我无法弄清楚为什么(第一个表有大约10.000个记录,第二个表有约10).

编辑:我已经更新了问题以提供额外的方案.

Mat*_*lie 7

SELECT
  table1.x
FROM
  table1
INNER JOIN
  table2
    ON table1.y = table2.z
GROUP BY
  table1.x
HAVING
      COUNT(*) = (SELECT COUNT(*) FROM table2 AS lookup)
  AND COUNT(*) = (SELECT COUNT(*) FROM table1 AS lookup WHERE x = table1.x)
Run Code Online (Sandbox Code Playgroud)

  • [我做了 - 尝试这个小提琴](http://sqlfiddle.com/#!3/cc627/15).它返回1和2.但更改为`COUNT(DISTINCT table1.y)`正常工作. (3认同)
  • @TimSchmelter - 你的小提琴里有一个拼写错误.你在表1中为第2组插入`a,c,c`.它应该是'a,b,c`. (2认同)