MSSQL查询帮助?应该很容易,但我必须要更多的咖啡?

时间:2013-08-20 18:40:52

标签: sql sql-server performance sql-server-2008

我知道这应该很容易,但我看不到森林里的树木。

TABLE 1
GNUM
Team1
Team2

TABLE 2
GNUM
ID
TeamID

对于表1中的每条记录,表2中可以有多个相关记录

这是我似乎无法弄清楚的

我需要有一个查询,告诉我什么时候TABLE2中没有针对特定游戏的特定团队的记录

For Example

TABLE1  
GNUM        Team1       Team2
1           A           B
2           A           C
3           B           A   
4           C           B   
5           B           A

TABLE 2
GNUM    TeamID
1       A
1       B
3       B
4       B
4       B
4       B

鉴于上述情况,我需要一个查询,告诉我表2中所有缺少记录的游戏。例如:

GNUM    Missing Team
2       A
2       C
3       A
4       C
5       B
5       A

4 个答案:

答案 0 :(得分:1)

您可以使用UNIONLEFT JOIN

SELECT a.*
FROM (SELECT GNUM, Team1
      FROM TABLE1  
      UNION
      SELECT GNUM, Team2
      FROM TABLE1  
      )a
LEFT JOIN TABLE2 b 
  ON a.GNUM = b.GNUM
  AND a.Team1 = b.TeamID
WHERE b.TeamID IS NULL

答案 1 :(得分:0)

SELECT GNUM, TEAM
FROM (
  SELECT t1.GNUM, Team1 AS TEAM
  FROM Table1 t1
  LEFT JOIN Table2 t2
  ON t1.GNUM = t2.GNUM 
    AND t1.Team1 = t2.TeamID
  WHERE t2.TeamID IS NULL
  UNION ALL
  SELECT t1.GNUM, Team2 AS TEAM
  FROM Table1 t1
  LEFT JOIN Table2 t2
  ON t1.GNUM = t2.GNUM 
    AND t1.Team2 = t2.TeamID
  WHERE t2.TeamID IS NULL
) t
ORDER BY GNUM, TEAM

分别抓取所有缺少的团队1和团队2行,然后合并结果。

Union all会比union更快,因为它不会执行不同的操作。这也是可取的,因为如果table1包含(9,'Z','Z')并且table2没有游戏编号9的条目,你可能会看到两行(9,'Z')结果。

如果您不关心记录排序,可以删除联合周围的包装查询,以略微提高性能。

SQL Fiddle.

答案 2 :(得分:0)

select *
from (select gnum, team1 t
      from table1
      union all
      select gnum, team2 t
      from table1) sq
where not exists(select top 1 1
                 from table2
                 where table2.gnum=sq.gnum and table2.teamid=sq.t)

您可以在此处看到它:http://sqlfiddle.com/#!3/7a839/4/0

答案 3 :(得分:0)

您也可以尝试这种方法:

SELECT GNUM, Team
  FROM (
       SELECT GNUM, Team1 AS Team
         FROM TABLE1  
       UNION
       SELECT GNUM, Team2 AS Team
         FROM TABLE1 ) AS TEAMS
 WHERE cast(GNUM as varchar(1)) + Team
       NOT IN (SELECT cast(GNUM as varchar(1)) + TeamID 
                 FROM TABLE2)

SQLFIDDLE:http://www.sqlfiddle.com/#!3/cd931/7/0