2014-11-14 158 views
0

有三個表T1, T2 and T3.的Sql涉及3個表

我想要一個SQL查詢,這些條件返回結果:

T1.Id is in T2.T1Id (T1.Id = T2.T1Id) 

AND there is not a row in T3 with Id from T2 for a certain date in a field in T3 

更新

下面的例子是第一個表名 - >列名 - >示例數據

enter image description here

輸入是日期

如果TimeIntervalId中斷而不是帶有輸入日期的DeletedBreak,則返回一行。

如果沒有與IntervalId沒有中斷不返回一行

+1

請顯示一些示例輸入和所需的結果。另外,你使用的是什麼RDBMS? MySQL,SQL-Server,Oracle? – Barmar 2014-11-14 20:12:34

+0

第一個條件是「T1.Id」和「T2.T1Id」或子字符串之間的精確等同比較嗎? – Barmar 2014-11-14 20:13:46

+0

要查找的行與另一個表中沒有匹配,用'左JOIN'後跟一個'NULL'檢查,或'NOT IN(SELECT ...)'或'NOT EXISTS(SELECT ...)'。見http://stackoverflow.com/questions/21633115/return-row-only-if-value-doesnt-exists-mysql?lq=1 – Barmar 2014-11-14 20:14:53

回答

0

我想你在找什麼是:

DECLARE @Date datetime = CAST('2014-11-13' as datetime) 

SELECT 1 Id 
into #TimeIntervals 

SELECT 1 Id, 1 TimeIntervalId 
INTO #Breaks 

SELECT 1 Id, 1 BreakId, CAST('2014-11-14' as datetime) as Date 
into #DeletedBreaks 

SELECT * 
FROM #TimeIntervals ti 
INNER JOIN #Breaks b on ti.Id = b.TimeIntervalId 
LEFT JOIN #DeletedBreaks db on db.BreakId = b.Id AND Date = @Date 
WHERE (db.Id is null) 

DROP TABLE #TimeIntervals 
DROP TABLE #Breaks 
DROP TABLE #DeletedBreaks  

內非常重要,因爲它確保沒有行如果回到那裏在休息桌上沒有休息。

編輯:b.Id將永遠不爲空,所以它被從where子句中刪除。