加入日期不在任何行的地方

时间:2014-12-26 20:23:02

标签: sql sql-server

我在Sql-server

中有以下表格

enter image description here

我想要做的是返回DeletedBreaks中没有行的所有Break,以及来自应用程序的相应BreakId和Date。 我试过跟随它,它返回所有没有输入日期的行。不应该挑选这些日期。

Select B.* From Breaks B JOIN TimeIntervals T ON B.TimeIntervalId=T.Id 
JOIN DeletedBreaks DB ON DB.BreakId=B.Id 
Where DB.BreakId IS NULL OR NOT EXISTS  
(Select DeletedDate From DeletedBreaks Where BreakId=B.Id AND DeletedDate = '2014-11-14') AND (T.Id = 1 ) 

因此,在上面的示例表中,它不应该返回一行,因为DeletedBreaks表中有一行带有输入日期。

“日期”字段应表示不应为此字段或此字段中具有值的任何其他日期返回任何行。

非常感谢帮助

更新

我也尝试过以下方法,可以帮助区分我不想要的东西。

SELECT b.*
FROM Breaks b
LEFT JOIN DeletedBreaks db ON db.BreakId = b.Id
WHERE db.Date <> @DeletedDate
OR    db.BreakId IS NULL

这个问题是它返回所有在DeletedBreaks.DeletedDate中的日期与行输入日期不匹配的行不是我想要的,我唯一应该生成结果的是如果没有DeletedBreaks .DeletedDate与输入日期相同

更新2

SELECT b.*
FROM Breaks b
LEFT JOIN DeletedBreaks db ON db.BreakId = b.Id
WHERE db.DeletedDate = @DeletedDate
OR db.BreakId IS NULL

上面与我想要的相反,当日期不在字段DeletedDate,bud&lt;&gt;字段中时,我希望所有人返回结果不能解决问题,因为那时breakId的每个其他日期都将被返回,并且只有在输入日期为DeletedDate时才返回结果,应忽略每个其他日期。

更新3

我会尝试更清楚,再举一个例子:

enter image description here

Select B.* From Breaks B JOIN TimeIntervals T ON B.TimeIntervalId=T.Id 
JOIN DeletedBreaks DB ON DB.BreakId=B.Id 
Where DB.BreakId IS NULL OR NOT EXISTS  
(Select DeletedDate From DeletedBreaks Where BreakId=B.Id AND DeletedDate = '2014-11-14') AND (T.Id = 1 ) 

如果输入日期是2014-11-14并输入TimeInterval.Id = 1,则应该没有结果(因为当天已删除了Id = 1的中断。)

如果输入日期是2014-11-15并且输入TimeInterval.Id = 1,则应返回所有具有TimeIntervalID = 1的Breaks。 (返回ID为1)

DeletedBreaks表中的DeletedDate字段表示删除了该特定日期和TimeintervalId的中断, 因此,当选择该日期进行输入时,它不应该返回中断。

如果DeletedBreaks中没有行,且BreakId = 1,并且与示例sql中的输入日期匹配的日期是静态但在我的应用程序中更改取决于所选内容,则应返回例如id为1的中断在应用程序中。

3 个答案:

答案 0 :(得分:0)

这应该可以用于获取不在DeletedBreaks表中的所有Breaks.Ids:

SELECT B.Id, B.TimeIntervalID
FROM Breaks B
WHERE B.Id NOT IN ( SELECT BreakID from DeletedBreaks)

答案 1 :(得分:0)

好的,我没有正确理解你需要什么。我现在还不确定。这会查询您需要的内容吗?

DECLARE @DeletedDate DATE = '2014-11-14'

SELECT b.*
FROM Breaks b
LEFT JOIN DeletedBreaks db ON db.BreakId = b.Id
WHERE db.Date = @DeletedDate
OR    db.BreakId IS NULL

希望这会有所帮助。如果没有,如果您提供更多行和所需查询结果的示例,则可能会有所帮助。

答案 2 :(得分:0)

获得所需结果的两种可能方法:

使用带有d.BreakID = b.ID和DeletedDate = @ DeletedDate条件的左连接,并排除那些带有DeletedDate的条件

SELECT b.* 
FROM Breaks b
JOIN TimeIntervals T ON b.TimeIntervalId=T.Id 
LEFT JOIN DeletetBreaks d ON d.BreakID=b.ID and d.DeletedDate=@DeletedDate
WHERE d.DeletedDate is NULL

或者从适合您条件的子查询中排除那些ID匹配的ID&#39;

SELECT b.* 
FROM @Breaks b
JOIN TimeIntervals T ON b.TimeIntervalId=T.Id 
WHERE b.ID not in (SELECT BreakID FROM @DeletetBreaks where DeletedDate=@DeletedDate )