我知道这应该很容易,但我看不到森林里的树木。
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
答案 0 :(得分: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
答案 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')结果。
如果您不关心记录排序,可以删除联合周围的包装查询,以略微提高性能。
答案 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