2013-09-27 140 views
1

我想知道如何使用基於CASEIF的不同WHERE子句。我更喜歡CASE,因爲聲明的其餘部分很複雜,我不喜歡這種複雜性的想法在兩個地方只有一點點區別。但是,我知道案例僅用於值。我在下面複製了我的問題的簡單版本。使用兩個不同的where子句

本質上,我有三個表。第一個包含主信息(MasterTable)。第二個包含屬於主表(Table1)的一對多關係。第三個是選擇器列表,指示在這個實例中將使用表1中的哪些記錄。我希望Table2的最新記錄驅動從Table1中選擇的內容,優先於OrderNum上的SubID。

MasterTable | MasterID,OtherInfo

表1 | T1UniqueId,MasterID,SubID,Text,OrderNum

表2 | T2UniqueId,MasterID,子ID,ORDERNUM,日期

SELECT MasterID, OtherInfo, SubID 
FROM MasterTable 
OUTER APPLY(
    SELECT TOP 1 SubID FROM Table1 
    WHERE Table1.MasterID=MasterTable.MasterID 
    CASE 
     WHEN 
     (
      SELECT TOP 1 SubID FROM Table2 
      WHERE Table2.MasterID=MasterTable.MasterID 
      ORDER BY Date DESC 
     ) Is NULL 
     THEN Table1.OrderNum= 
      (
       SELECT TOP 1 OrderNum 
       FROM Table2 
       WHERE Table2.MasterId=MasterTable.MasterId 
       ORDER BY Date DESC 
      ) 
     ELSE Table1.SubId= 
      (
       SELECT TOP 1 SubId 
       FROM Table2 
       WHERE Table2.MasterId=MasterTable.MasterId 
       ORDER BY Date DESC 
      ) 
    END 

) SubData 
+0

如果這樣的工作,你仍然需要一個額外的'和'前'CASE在你的'WHERE'子句中,但不幸的是'CASE'不能以這種方式使用,它只是將'THEN'和'ELSE'的值輸出到嵌入表達式;你不能用它來輸出一個條件。 – DrCopyPaste

+0

@DrCopyPaste謝謝。我確實知道這一點,但我不知道如何糾正它做我想要的。我用這個案例來說明不僅僅是一個解決方案。 – steventnorris

回答

1

一個的這種快速重寫會導致如下:

IF ((SELECT TOP 1 SubID FROM Table2 WHERE Table2.MasterID=MasterTable.MasterID ORDER BY Date DESC) IS NULL) 
BEGIN 
    SELECT 
      MasterID, OtherInfo, SubID 
     FROM MasterTable 
     OUTER APPLY(
      SELECT TOP 1 SubID FROM Table1 
      WHERE 
       Table1.MasterID=MasterTable.MasterID 
       AND Table1.OrderNum = 
       (
        SELECT TOP 1 OrderNum 
        FROM Table2 
        WHERE Table2.MasterId=MasterTable.MasterId 
        ORDER BY Date DESC 
       ) 
     ) SubData 
END 
ELSE 
BEGIN 
    SELECT 
      MasterID, OtherInfo, SubID 
     FROM MasterTable 
     OUTER APPLY(
      SELECT TOP 1 SubID FROM Table1 
      WHERE 
       Table1.MasterID=MasterTable.MasterID 
       AND Table1.SubId= 
       (
        SELECT TOP 1 SubId 
        FROM Table2 
        WHERE Table2.MasterId=MasterTable.MasterId 
        ORDER BY Date DESC 
       ) 
     ) SubData 
END 

但正如你指出,使它看起來醜陋,因爲你現在有這種複雜性在兩個地方...

我猜你也可以制定這種方式(未經測試,但這應該讓你的複雜邏輯在一個地方):

SELECT 
     MasterID, OtherInfo, SubID 
    FROM MasterTable 
    OUTER APPLY(
     SELECT TOP 1 SubID FROM Table1 
     WHERE Table1.MasterID=MasterTable.MasterID 
     AND 
     (
      (
       (
        SELECT 
          TOP 1 SubID 
         FROM Table2 
         WHERE Table2.MasterID=MasterTable.MasterID 
         ORDER BY Date DESC 
       ) IS NULL 
       AND 
       Table1.OrderNum = 
       (
        SELECT TOP 1 OrderNum 
        FROM Table2 
        WHERE Table2.MasterId=MasterTable.MasterId 
        ORDER BY Date DESC 
       ) 
      ) 
      OR 
      (
       Table1.SubId = 
       (
        SELECT 
          TOP 1 SubId 
         FROM Table2 
         WHERE Table2.MasterId=MasterTable.MasterId 
         ORDER BY Date DESC 
       ) 
      ) 
     ) 
    ) SubData 
0

如果子ID和ORDERNUM在表1和表2,你可以使用嵌套的select語句簡單的查詢相同:

select m.MasterID, m.OtherInfo, (
    select top 1 coalesce(t2.SubID, t2.OrderNum) from Table2 t2 
    where t2.MasterID = m.MasterID order by date desc 
) as SubID 
from MasterTable m; 
+0

ordernum和subid是不同的。 subID是一個數字號碼,而ordernum表示放置在一個列表中。所以,訂單可能是1,2,3而子目錄是000111,000222,000333。我想根據subid進行選擇,因爲每個masterid可能有多個有序集。 – steventnorris

+0

通過我的添加我的意思是Table1.SubID = Table2.SubID和Table1.OrderNum = Table2.OrderNum。如果適用,請嘗試上面的查詢 –

+0

這並不能從我的數據中得到想要的答案。我不需要返回subId或OrderNum。我需要將它匹配的內容返回給table1。 – steventnorris