Sql 如何查询两个表以比较数据

Sql 如何查询两个表以比较数据,sql,sql-server,sql-server-2005,Sql,Sql Server,Sql Server 2005,我很难想出一种方法来比较SQLServer(2005)中的一些数据。我有两个表,我需要确保表1中的值在表2中匹配。下面是表结构和一些示例数据 Table 1 GenreId 6 这是一个临时表,其中包含传入的ID列表 Table 2 Show| GenreId Show1 | 2 Show1 | 6 Show2 | 6 这张桌子上可以有许多GenreID用于表演。我试图找出如何检索的结果是,我只需要显示表1中的genreid。因此,我预计最终的结果将是: 如果表1有6个,我希望只得到Sh

我很难想出一种方法来比较SQLServer(2005)中的一些数据。我有两个表,我需要确保表1中的值在表2中匹配。下面是表结构和一些示例数据

Table 1 
GenreId
6 
这是一个临时表,其中包含传入的ID列表

Table 2
Show| GenreId
Show1 | 2
Show1 | 6
Show2 | 6
这张桌子上可以有许多GenreID用于表演。我试图找出如何检索的结果是,我只需要显示表1中的genreid。因此,我预计最终的结果将是:

如果表1有6个,我希望只得到Show2。如果表1有2和6,那么我得到Show1和Show2


我知道这可能很简单,但我真的是一片空白。非常感谢您的帮助。

这是您需要的查询:

SELECT SHOW FROM t2
WHERE SHOW NOT IN (
  SELECT SHOW FROM t2
  WHERE genreId NOT IN (6, 2)
)
GROUP BY SHOW
HAVING count(DISTINCT genreId) = 2
这些问题有点棘手。考虑到
HAVING
子句中的数字必须与
in
子句中
项的数量相匹配

现在,如果您有一个包含这些ID的表,那么您可以通过以下方式解决它:

SELECT SHOW FROM t2
WHERE SHOW NOT IN (
  SELECT SHOW FROM t2
  WHERE genreId NOT IN (
    SELECT genreId FROM t1
  )
)
GROUP BY SHOW
HAVING count(DISTINCT genreId) = (SELECT COUNT(*) FROM t1)

小提琴。

这是您要查找的查询:

SELECT SHOW FROM t2
WHERE SHOW NOT IN (
  SELECT SHOW FROM t2
  WHERE genreId NOT IN (6, 2)
)
GROUP BY SHOW
HAVING count(DISTINCT genreId) = 2
这些问题有点棘手。考虑到
HAVING
子句中的数字必须与
in
子句中
项的数量相匹配

现在,如果您有一个包含这些ID的表,那么您可以通过以下方式解决它:

SELECT SHOW FROM t2
WHERE SHOW NOT IN (
  SELECT SHOW FROM t2
  WHERE genreId NOT IN (
    SELECT genreId FROM t1
  )
)
GROUP BY SHOW
HAVING count(DISTINCT genreId) = (SELECT COUNT(*) FROM t1)

小提琴。

这是您要查找的查询:

SELECT SHOW FROM t2
WHERE SHOW NOT IN (
  SELECT SHOW FROM t2
  WHERE genreId NOT IN (6, 2)
)
GROUP BY SHOW
HAVING count(DISTINCT genreId) = 2
这些问题有点棘手。考虑到
HAVING
子句中的数字必须与
in
子句中
项的数量相匹配

现在,如果您有一个包含这些ID的表,那么您可以通过以下方式解决它:

SELECT SHOW FROM t2
WHERE SHOW NOT IN (
  SELECT SHOW FROM t2
  WHERE genreId NOT IN (
    SELECT genreId FROM t1
  )
)
GROUP BY SHOW
HAVING count(DISTINCT genreId) = (SELECT COUNT(*) FROM t1)

小提琴。

这是您要查找的查询:

SELECT SHOW FROM t2
WHERE SHOW NOT IN (
  SELECT SHOW FROM t2
  WHERE genreId NOT IN (6, 2)
)
GROUP BY SHOW
HAVING count(DISTINCT genreId) = 2
这些问题有点棘手。考虑到
HAVING
子句中的数字必须与
in
子句中
项的数量相匹配

现在,如果您有一个包含这些ID的表,那么您可以通过以下方式解决它:

SELECT SHOW FROM t2
WHERE SHOW NOT IN (
  SELECT SHOW FROM t2
  WHERE genreId NOT IN (
    SELECT genreId FROM t1
  )
)
GROUP BY SHOW
HAVING count(DISTINCT genreId) = (SELECT COUNT(*) FROM t1)

小提琴。

使用此查询。它检查该节目是否是所选流派的唯一节目

SELECT DISTINCT Show FROM Table2
INNER JOIN Table1 ON Table1.GenreId = Table2.GenreId
AND (SELECT Count(DISTINCT GenreId) FROM Table2 T2 WHERE Table2.Show = T2.Show) = 1

使用此查询。它检查该节目是否是所选流派的唯一节目

SELECT DISTINCT Show FROM Table2
INNER JOIN Table1 ON Table1.GenreId = Table2.GenreId
AND (SELECT Count(DISTINCT GenreId) FROM Table2 T2 WHERE Table2.Show = T2.Show) = 1

使用此查询。它检查该节目是否是所选流派的唯一节目

SELECT DISTINCT Show FROM Table2
INNER JOIN Table1 ON Table1.GenreId = Table2.GenreId
AND (SELECT Count(DISTINCT GenreId) FROM Table2 T2 WHERE Table2.Show = T2.Show) = 1

使用此查询。它检查该节目是否是所选流派的唯一节目

SELECT DISTINCT Show FROM Table2
INNER JOIN Table1 ON Table1.GenreId = Table2.GenreId
AND (SELECT Count(DISTINCT GenreId) FROM Table2 T2 WHERE Table2.Show = T2.Show) = 1

好吧,这应该是可行的,但如果
表2
很大,它的性能可能会很糟糕

SELECT * FROM Table2 t2
WHERE NOT EXISTS(
    SELECT GenreID 
    FROM Table1
    WHERE GenreID NOT IN (
        SELECT GenreID 
        FROM Table2 
        WHERE Show = t2.Show))
AND NOT EXISTS(
    SELECT GenreID 
    FROM Table2
    WHERE GenreID NOT IN (
        SELECT GenreID FROM Table1)
    AND Show = t2.Show)

好吧,这应该是可行的,但如果
表2
很大,它的性能可能会很糟糕

SELECT * FROM Table2 t2
WHERE NOT EXISTS(
    SELECT GenreID 
    FROM Table1
    WHERE GenreID NOT IN (
        SELECT GenreID 
        FROM Table2 
        WHERE Show = t2.Show))
AND NOT EXISTS(
    SELECT GenreID 
    FROM Table2
    WHERE GenreID NOT IN (
        SELECT GenreID FROM Table1)
    AND Show = t2.Show)

好吧,这应该是可行的,但如果
表2
很大,它的性能可能会很糟糕

SELECT * FROM Table2 t2
WHERE NOT EXISTS(
    SELECT GenreID 
    FROM Table1
    WHERE GenreID NOT IN (
        SELECT GenreID 
        FROM Table2 
        WHERE Show = t2.Show))
AND NOT EXISTS(
    SELECT GenreID 
    FROM Table2
    WHERE GenreID NOT IN (
        SELECT GenreID FROM Table1)
    AND Show = t2.Show)

好吧,这应该是可行的,但如果
表2
很大,它的性能可能会很糟糕

SELECT * FROM Table2 t2
WHERE NOT EXISTS(
    SELECT GenreID 
    FROM Table1
    WHERE GenreID NOT IN (
        SELECT GenreID 
        FROM Table2 
        WHERE Show = t2.Show))
AND NOT EXISTS(
    SELECT GenreID 
    FROM Table2
    WHERE GenreID NOT IN (
        SELECT GenreID FROM Table1)
    AND Show = t2.Show)
如果表1有6个,我希望只得到Show2。如果表1有2和6, 然后我得到Show1和Show2

(演示在Sql Server 2012上进行,但查询应在2005年进行):

如果表1有6个,我希望只得到Show2。如果表1有2和6, 然后我得到Show1和Show2

(演示在Sql Server 2012上进行,但查询应在2005年进行):

如果表1有6个,我希望只得到Show2。如果表1有2和6, 然后我得到Show1和Show2

(演示在Sql Server 2012上进行,但查询应在2005年进行):

如果表1有6个,我希望只得到Show2。如果表1有2和6, 然后我得到Show1和Show2

(演示在Sql Server 2012上进行,但查询应在2005年进行):


我的错。我想我理解你现在的要求

这个


我的错。我想我理解你现在的要求

这个


我的错。我想我理解你现在的要求

这个


我的错。我想我理解你现在的要求

这个



为什么6只应选择Show2?在这种情况下,如果存在多个流派,则该剧必须与提供的所有流派匹配。很难用样本数据来说明。表1中的2和6不符合所有提供的标准,因此只应选择Show1为什么6只应选择Show2?在这种情况下,如果存在多个流派,则该剧必须符合所有提供的流派。很难用样本数据来说明。表1中的2和6不符合所有提供的标准,因此只应选择Show1为什么6只应选择Show2?在这种情况下,如果存在多个流派,则该剧必须符合所有提供的流派。很难用样本数据来说明。表1中的2和6不符合所有提供的标准,因此只应选择Show1为什么6只应选择Show2?在这种情况下,如果存在多个流派,则该剧必须符合所有提供的流派。很难用样本数据来说明。表1中的2和6表明,2不会匹配所有提供的标准,因此,如果表1中有6,我只希望得到Show2
这不是答案我还没有测试过这一点,但我知道确保所有且只有所有元素都匹配一个集合的唯一方法是双重否定。。。我只是在这里看不到。所以我不得不假设你可能添加了一些你实际上不应该添加的元素。@MostyMostacho所以请在发表评论之前测试一下。问题是关于一个节目是唯一的类型。所以我在检查count(genreid)=1,需要双重否定吗?如果你不想要我的评论,那么不要让我检查你的编辑。我也不会测试你的查询。我提供了一个提琴,你可以用它来测试自己。“检查编辑”的评论是问问题的人,因为我的第一个答案是不正确的。如果表1有6个,我希望只得到Show2
这不是我没有得到的答案