Sql 日期不在任何行中的联接

Sql 日期不在任何行中的联接,sql,sql-server,Sql,Sql Server,我在Sql server中有下表 我要做的是返回DeletedBreaks中没有行的所有中断,并返回作为应用程序输入的相应BreakId和日期。 我尝试了以下操作,它返回了所有没有输入日期的行。这些日期不应该被挑出来 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 O

我在Sql server中有下表

我要做的是返回DeletedBreaks中没有行的所有中断,并返回作为应用程序输入的相应BreakId和日期。 我尝试了以下操作,它返回了所有没有输入日期的行。这些日期不应该被挑出来

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表中有一行带有输入日期

Date字段应该指示不应为此字段中有值的日期或任何其他日期返回任何行

非常感谢您的帮助

更新

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

SELECT b.*
FROM Breaks b
LEFT JOIN DeletedBreaks db ON db.BreakId = b.Id
WHERE db.Date <> @DeletedDate
OR    db.BreakId IS NULL
以上与我希望的相反,我希望所有人都返回结果,当日期不在字段DeletedDate中时,不要解决问题,因为该breakId的每一个其他日期都将被返回,并且只有当输入日期在DeletedDate中时才应返回结果,应忽略每一个其他日期

更新3

我会尽量说得更清楚,再举一个例子:

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,输入的时间间隔为.Id=1,则应该没有结果(因为Id=1的中断在当天已被删除。)

如果输入日期为2014-11-15,输入的时间间隔Id=1,则应返回所有TimeIntervalID=1的中断。(返回Id为1的中断)

DeletedBreaks表中的DeletedDate字段表示删除该特定日期和时间间隔的中断, 因此,当选择该日期作为输入时,不应返回中断


如果在BreakId=1的DeletedBreaks中没有行,并且与示例sql中的输入日期匹配的日期是静态的,但在我的应用程序中根据在应用程序中选择的内容而更改,则应返回一个具有示例id 1的中断。

这应该适用于获取所有中断。不在DeletedBreaks表中的id:

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

好的,我没有正确理解你需要什么。我现在还不确定我是否能做到。这是你需要的吗

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

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

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

使用带有条件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

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 )

请用问题的标题来描述问题。正如所写的,它没有任何意义;我们可以从您的标签中看出它与SQL有关,您显然需要帮助,否则您就不会在这里发布。标题应该是关于特定问题的,并且应该是当这个网站的未来用户在寻找问题解决方案时,在搜索结果中出现时有意义的。谢谢。谢谢,我尝试过这种方法,但问题是它返回所有在DeletedBreaks.DeletedDate中日期与输入日期不匹配的行,这不是我想要的,唯一应该生成结果的是,如果没有与输入日期相同的DeletedBreaks.DeletedDate。如果日期与输入日期匹配,则更新将返回结果。如果日期不在表中,我希望它返回结果,同时不返回与日期不匹配的其他行。中断在时间间隔之间共享,在中断表中使用intervalId。但在某些日期,我希望能够删除休息时间,但这种情况很少发生。对不起,我仍然不明白你需要什么。“日期不在表中”是什么意思。。。你是说桌子上的任何地方?您能提供一个包含多行和所需结果的示例吗?谢谢,但即使DeletedBreaks中有相应的Id,is有时也应该返回break,事实上,如果输入日期不在DeletedDate字段中,它应该始终返回break
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 )