2014-11-16 51 views
0

我想從TableB中選擇具有VacationHistory(TableA)表中某個日期範圍之間的開始日期的項目。從表B中的日期與TableA中的多個日期範圍進行比較:Building WHERE語句

假設我有VacationHistory數據表(TableA)具有開始和結束日期值。我需要做的是將來自另一個數據表(TableB)的日期與VacationHistory(TableA)中的日期範圍進行比較。所以,如果在VacationHistory數據表中三個條目,我會做這樣的事情:

SELECT * 
FROM TableB WHERE (
     (DateInTableB BETWEEN '2014-10-21' AND '2014-10-27') 
    OR (DateInTableB BETWEEN '2014-11-05' AND '2014-11-13') 
    OR (...) 
) 

但是,我怎麼能建立使用VacationHistory表中的所有日期範圍此查詢在此WHERE子句。我想沒有什麼我可以說BETWEEN IN (....)

東西,我試過了,是要建立整個的字符串where子句::

DECLARE @listStr VARCHAR(MAX) 
SELECT @listStr = COALESCE(@listStr + ' OR ' , '') + 
    ('DateInTableB BETWEEN ''' + CAST(StartDate AS NVARCHAR) + ''' AND ' 
       + '''' + CAST(EndDate AS NVARCHAR) + '''') 
FROM VacationHistory 
SELECT @listStr 

採用具有這樣的事情@listStrDateInTableB BETWEEN '2014-11-05' AND '2014-11-13' OR DateInTableB BETWEEN '2014-10-21' AND '2014-10-27'

不過,我不認爲我可以使用@ listStr直接在where子句中,如下所示:

WHERE (@listStr) 

我能做些什麼呢?

回答

1

如果你只是想找個TableB中的行有任何TableA中的日期範圍的開始日期,你可以使用相關exists

select * 
from TableB b 
where exists (
    select 1 
    from TableA a 
    where b.StartDate between a.StartDate and a.EndDate 
) 

Sample SQL Fiddle

+0

哇,這是偉大的。這正是我需要的。非常感謝! – 22332112

0

一個簡單INNER JOIN是你需要什麼。

SELECT DISTINCT b.id, 
     b.StartDate 
FROM TableB b 
     JOIN TableA a 
     ON b.StartDate BETWEEN a.StartDate AND a.EndDate 

或者

SELECT * 
FROM TableB 
     INNER JOIN (SELECT Min(StartDate) StartDate, 
          Max(EndDate) EndDate 
        FROM TableA) A 
       ON DateInTableB BETWEEN A.StartDate AND A.EndDate 

不過,如果你想在你已經嘗試的方式答案,那麼你需要有Dynamic SQL

declare @sql nvarchar(max) 
DECLARE @listStr VARCHAR(MAX) 

SELECT @listStr = COALESCE(@listStr + ' OR ' , '') + 
    ('DateInTableB BETWEEN ''' + CAST(StartDate AS NVARCHAR) + ''' AND ' 
       + '''' + CAST(EndDate AS NVARCHAR) + '''') 
FROM VacationHistory 


set @sql = 'SELECT * 
FROM TableB where '[email protected]+'' 

exec sp_executesql @sql 
+0

請注意,如果在TableA中匹配多個日期範圍(除非添加了distinct或group by子句),則使用內部連接的查詢將從TableB返回相同的ID。 – jpw

0
SELECT * 
FROM TableB 
inner join 
(
select Min(StartDate) StartDate, Max(EndDate) EndDate From TableA 
) A 
on DateInTableB between A.StartDate and A.EndDate