比较两个表并提取每个日期缺少的元素

时间:2012-05-26 16:56:37

标签: sql sql-server sql-server-2008 tsql sql-server-2005

大家好我的SQL查询有问题,我找不到解决方案。

在我的数据库中,我有两个表,Mytable1和Mytable2。 Mytable1包含列idCalendar,idPlayer,datePlaying和Mytable2包含列idPlayer和namePlayer。

我想在Mytable1中提取没有参加比赛的球员的名字。

例如 Mytable1(包含播放器和播放日期):

idCalendar|idPlayer|datePlaying

1         |     1  | 05/01/2012
2         |     2  | 06/01/2012
3         |     3  | 08/01/2012
4         |     2  | 05/01/2012

1 | 1 | 05/01/2012 2 | 2 | 06/01/2012 3 | 3 | 08/01/2012 4 | 2 | 05/01/2012

Mytable2(包含所有玩家名称):

idPlayer|namePlayer

1  | P1
2  | P2
3  | P3
4  | P4

我想创建一个显示以下结果的视图:

ViewResult(没有按日期比赛的球员):

1 | P1 2 | P2 3 | P3 4 | P4

datePlaying | playerName

正如您所看到的,我需要获得此信息的结果:   - 在05/01/2012 P2和P3没有参加比赛。   - 在06/01/2012 P1和P3没有参加比赛。   - 在08/01/2012 P1和P2没有参加比赛。

我希望我已经足够清楚了。提前谢谢。

2 个答案:

答案 0 :(得分:3)

可能这么简单的事情会起作用。

select
    d.datePlaying, p.namePlayer
from
    table2 p
cross join 
    (select distinct datePlaying from table1) d
left join
    table1 t on t.idPlayer = p.idPlayer and t.datePlaying = d.datePlaying
where
    t.idPlayer is null

作为旁注,如果你有一个非玩家参与的日期会发生什么?你不会在table2中有一个条目。你关心还是应该有第3个表来表示任何球员应该参加的日期。这个日期表将用于替换我的别名' d'交联表。

答案 1 :(得分:0)

我在这台电脑上没有手持数据包,所以我暂时无法测试 - 我会继续研究它。

SELECT     DISTINCT a.datePlaying, b.playerName
FROM       Mytable1 a
INNER JOIN Mytable2 b
        ON a.idPlayer = b.idPlayer
WHERE      NOT EXISTS (
           SELECT idPlayer
           FROM   Mytable1 a2
           WHERE  a.datePlaying = a2.datePlaying)
ORDER BY   a.datePlaying