2017-09-13 139 views
0

我需要做一個子查詢,但需要它的值基於主查詢。子查詢加入主查詢

基本上,我試圖從表中獲得ID,DateValue,我們將其稱爲Orders。但是,如果WHERE條款中的指定日期沒有值,則我想知道該值的起始日期(無論是在指定日期之前還是之後)。

下落的查詢是錯誤的,但它或許可以解釋我的邏輯:

SELECT 
    O.ID 
    ,O.Date 
    ,CASE 
     WHEN O.Value IS NULL 
     THEN 
     (SELECT MAX(Date) 
      FROM Orders AS O1 
      WHERE O1.ID = O.ID 
     ELSE O.Value END 
    ) as Value 
FROM Orders O 
WHERE O.date = '2017-01-01' 

我希望得到以下內容,例如:

ID Value 
001 100 
002 300 
003 12-30-2016 
+0

它如何失敗?你能詳細說明嗎? – vignesh

回答

1

您可以使用CROSS APPLY/OUTER APPLY,它是使您能夠查詢兩個或多個相關查詢:

select 
     o.id 
    , o.date 
    , case when o.value is null then t.dt else o.value end as value 
from orders o outer apply (select o1.id, max(date) dt 
          from orders as o1 
          where o1.id = o.id 
          group by o1.id 
         ) t 
where o.date = 2017-01-01 
+1

第一次使用外部應用程序,但它完全工作 - 謝謝^ – kazzi

1

你只要把閉幕括號在錯誤的地方:

SELECT 
    O.ID 
    ,O.Date 
    ,CASE 
     WHEN O.Value IS NULL 
     THEN 
     (SELECT MAX(Date) 
      FROM Orders AS O1 
      WHERE O1.ID = O.ID) 
     ELSE O.Value 
    END as Value 
FROM Orders O 
WHERE O.date = '2017-01-01' 

或使用COALESCE:

,COALESCE(O.Value 
      ,(SELECT MAX(Date) 
       FROM Orders AS O1 
       WHERE O1.ID = O.ID 
      ) 
      ) as Value 

當然,你仍然可能會出現錯誤,由於不匹配的數據類型,再抹上兩O.Value和標量子查詢爲VARCHAR。