0

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

Table 1 
GenreId
6 

这是一个临时表,其中包含传入的 ID 列表。

Table 2
Show| GenreId
Show1 | 2
Show1 | 6
Show2 | 6

该表可以有许多节目的流派 ID。我试图弄清楚如何检索的结果是我只需要显示只有表 1 中的 GenreIds。所以我最终期望的结果是:

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

我知道这可能很简单,但我真的是在画一个空白。很感谢任何形式的帮助。

4

6 回答 6

1

好吧,这应该可以,但是如果Table2很大,它的性能可能会很糟糕......

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)
于 2013-10-15T20:33:48.937 回答
1

这是您要查找的查询:

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)

在这里拉小提琴。

于 2013-10-15T20:25:27.487 回答
1

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

小提琴演示(演示在 Sql Server 2012 上,但查询应该在 2005 上工作):

select Max([show]) myShow
from T2 join T1
      on T2.GenreId = T1.GenreId
Group by T2.GenreId;
于 2013-10-15T20:35:18.733 回答
0
select Show from Table2
inner join Table1
on Table1.GenreId = Table2.GenreId
于 2013-10-15T20:29:20.600 回答
0

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

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
于 2013-10-15T20:29:41.023 回答
0

我的错。我想我明白你现在在问什么。

这个?

select Show from Table2
where genreid in (select genreid from Table1)
except
select Show from Table2
where genreid not in (select Genreid from Table1)
于 2013-10-15T20:44:48.943 回答