2012-05-26 59 views
0

嗨,大家好,我有一個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 

Mytable2(包括所有球員的名字):

idPlayer|namePlayer

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

我想創建一個視圖顯示以下結果:

ViewResult(玩家誰沒有按日期飾演):

datePlaying | playerName

05/01/2012 | P2 
05/01/2012 | P3 
06/01/2012 | P1 
06/01/2012 | P3 
08/01/2012 | P1 
08/01/2012 | P2 

正如你可以看到我需要這方面的信息而導致: - 在2012/05/01 P2和P3沒打過。 - 在06/01/2012 P1和P3還沒有打過。 - 2012年8月1日P1和P2沒有出場。

我希望我已經夠清楚了。先謝謝你。

+0

它在我看來像P2 DID玩在05/01/2012。這只是一個錯字嗎?而P4在你的ViewResult中完全不顯示 - 他們沒有在任何日期播放。最後,ViewResult是否應該顯示每個可能的日期,以及所有沒有在該日期玩的玩家?還是隻顯示Mytable1中的日期? –

+0

@Jeremy Goodell感謝您的回覆。是的,我只需要顯示在Mytable1中顯示的日期,以及在此日期沒有參與的玩家的名字 – Tlachtga

+0

Mytable2中的ID是否正確? P2和P4都有相同的ID。 –

回答

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中有一個條目。你是否在乎或應該有第三張桌子來表示任何球員應該參加的比賽日期。這個日期表將被用來取代我的別名'd'交叉連接表。

+0

非常感謝你太棒了!特別是第三張桌子的想法,你可以預見我的需求。 – Tlachtga

+0

@mouters:+1爲您的答案。據我所知,我們的查詢返回相同的結果集。你知道是否有一個優於另一個的性能優勢? (我不知道 - 只是好奇。) –

+0

@HeadOfCatering,很難說沒有通過SMS運行它並顯示執行路徑的詳細信息。通常當我假設一個查詢會比另一個查詢更好時,sql server query optimizer證明我錯了。我對你的查詢的直覺反應是,sql服務器將不得不掃描Hashbytes()函數的結果,特別是因爲你在連接日期和名稱字段。但正如我所說的查詢優化器設法每次證明我錯了,所以他們可能是平等的:) –

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 
+0

那是行不通的:s – Tlachtga

+0

我修改了它,這可能會更好。 –