2012-12-23 53 views
1

假設我有三個表是這樣的:SQL連接三個表的基礎上,日期條件

TABLE_X  TABLE_Y  TABLE_Z 
--------------------------------------- 
2012/1/1 a   b 
2012/1/2 a   b 
...   a   b 
2012/3/17 a   b 
2012/3/18 a   b 
2012/3/19 a   b 
...   a   b 
2012/12/22 a   b 
2012/12/23 a   b 
2012/12/24 a   b 
...   a   b 
2013/1/1 a   b 

我需要做的是使用GETDATE()作爲條件的圖。 GETDATE()過去和過去的所有值將會變爲TABLE_Y列。 GETDATE()將來的所有值將會變爲TABLE_Z列。

view_TABLE_X_JOIN_Y_Z 
--------------------- 
2012/1/1 a 
2012/1/2 a 
...   a 
2012/3/17 a 
2012/3/18 a 
2012/3/19 a 
...   a 
2012/12/22 a 
GETDATE() a 
2012/12/24 b 
...   b 
2013/1/1 b 
2013/1/2 b 

我曾嘗試:

SELECT x.Date 
    ,CASE WHEN GETDATE() > x.Date THEN z.Value 
    ELSE y.Value 
    END AS Value 
FROM TABLE_X x 
LEFT JOIN TABLE_Y y ON x.Date = y.Date 
LEFT JOIN TABLE_Z z ON x.Date = z.Date 

的問題是,日期是不完美的FK引用。即日期在TABLE_X完成,但它們在Y和Z.

+0

那麼什麼似乎是問題嗎?你有沒有嘗試過一些具體的問題? – aviad

+0

@aviad我已編輯該問題以進一步說明。 – Kyle

+0

當日期不見了時你想做什麼?跳過那一行?考慮它'很久以前'?重要的是:有沒有重複? – Confusion

回答

2

您可以使用這樣的事情:

SELECT 
    CASE WHEN table_x.date_column > GETDATE() THEN table_y.some_column 
              ELSE table_z.some_column END 
FROM table_x JOIN table_y JOIN table_z (insert appropriate join clauses) 
0

一些地方缺少我不知道的正確理解你的問題,但我認爲這將做到這一點:

SELECT x.date, y.* 
FROM x INNER JOIN y ON x.date = y.date 
WHERE x.date <= GETDATE() 

UNION 

SELECT x.date, z.* 
FROM x INNER JOIN z ON x.date = z.date 
WHERE x.date > GETDATE() 

我承擔即x,y和z是不同的表,並在y和z的日期外鍵引用X,也y和z應具有相同的列結構

+0

啊,謝謝。這很重要;但這些表格並不具有相同的結構,所以聯盟不適合我。再次感謝。 – Kyle

0

我不知道,試試這個,

create view view_TABLE_X_JOIN_Y_Z as(select y.* from table_y y 
where getdate() > (select date from TABLE_X x where y.date=x.date) 
union all 
select z.* from table_z z where getdate() <= (select date from TABLE_x x 
where z.date=x.date)) 

提供,這兩個表應該有相同的列結構