2014-11-14 121 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子句中删除。