3

我知道这应该很容易,但我不能只见树木不见森林。

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

4 回答 4

1

您可以为此使用UNION和:LEFT 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
于 2013-08-20T18:48:18.037 回答
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

于 2013-08-20T18:50:03.077 回答
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

于 2013-08-20T19:26:16.293 回答
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小提琴。

于 2013-08-20T18:47:35.260 回答