2016-08-12 59 views
0

我有一個名爲capacity_daily_values的表,其中我在兩個方向上存儲國家之間的日常值。加入同一個表兩次以查找缺失的數據

表的模式是這樣的:

id | direction | date_id | value 

我需要有一個日期兩行表中的兩個方向。這樣的:

1 | 1 | 2015-01-01 | 1.00 
2 | 2 | 2015-01-01 | 1.00 

不幸的是一些數據丟失,我有隻值兩個方向之一,我需要找出哪些日期爲損壞。

我試着左連接兩個表,看看哪個結果有NULL值,但沒有成功。

SELECT * FROM `capacity_daily_values` c1 
LEFT JOIN capacity_daily_values c2 
    on c1.date_id = c2.date_id and c1.direction = 1 and c2.direction = 2 
having value is null 

我感謝您的幫助!

回答

0

如果你想這裏僅列出了不完整的日期,你可以使用這個:

SELECT date_id, COUNT(*) 
FROM capacity_daily_values 
GROUP BY date_id 
HAVING COUNT(*) < 2 

見我的小提琴 - http://sqlfiddle.com/#!9/37c60/1

0

我會用一個常規的加入,就像你所使用的,然後選擇未包含在該連接表中的所有條目。

SELECT c1.* FROM `capacity_daily_values` c1 WHERE c1.id not in 
(
    SELECT c2.id FROM `capacity_daily_values` c2 JOIN `capacity_daily_values` c3 
    ON c2.direction != c3.direction AND c2.date_id = c3.date_id 
) 

我在我的子表中兩次列出每對條目,以獲得兩個條目ID。

具有損壞日期的所有ID都不應出現在此子表中。

+0

乍一看,LEFT JOIN解決方案(通過e4c5)在性能方面明顯優於我。 GROUP BY解決方案(由Roman Hocke提供)。我推薦其中之一。 – TheHowlingHoaschd