2011-07-22 29 views
0

我有一個Orders表,我想從Orders表中取出一些列,並從兩個OrderDetails表中的一個取決於Orders表中列的值。如何使用子查詢中的多個表達式創建一個SQL存儲過程

訂單

OrderID Pk int 
OrderDetails_A_ID 
OrderDate 
OrderedById 

OrderDetails_A

OrderDetails_A_ID Pk int 
OrderID Fk int 
Qty_A 
ItemDesc_A 

OrderDetails_B

OrderDetails_B_ID Pk int 
OrderID Fk int 
Qty_B 
ItemDesc_B 

這裏是我硝酸鉀w不起作用,但我想要做的。

SELECT O.OrderDate,O.OrderedByID, 
CASE WHEN O.OrderDetails_A_ID IS NULL 
    THEN 
    SELECT B.ItemDesc_B as ItemDesc,B.Qty_B as Qty 
    ELSE 
    SELECT A.ItemDesc_A as ItemDesc,A.Qty_A as Qty 
    END 
FROM Orders as O 

回答

2

您沒有在您的示例中包含任何JOIN條件,因此我也將它們從中省略。

SELECT O.OrderDate,O.OrderedByID, 
CASE WHEN O.OrderDetails_A_ID IS NULL THEN B.ItemDesc_B ELSE A.ItemDesc_A END as ItemDesc, 
CASE WHEN O.OrderDetails_A_ID IS NULL THEN B.Qty_B ELSE A.Qty_A END as Qty 
FROM Orders as O 
+0

會,即使編譯? – GSerg

+0

不,但他的例子都不會。我假設他沒有包含他的JOIN標準,因爲他已經知道如何進行加入,並希望我們專注於對數據進行排序。 – ean5533

2

您可以合併或使用聯合使用內部聯接。

使用合併,您可以控制每個字段。使用聯合,您不必一遍又一遍地指定確切的列。

合併:

select o.OrderID, COALESCE(a.Qty_A, a.Qty_B) as Qty 
from Orders o 
left outer join Order_Detail_A a on o.OrderID = a.OrderID and o.OrderDetails_A_ID is not null 
left outer join Order_Detail_B b on o.OrderID = b.OrderID and o.OrderDetails_A_ID is null 

工會:

select o.OrderID, a.Qty_A as Qty 
from Orders o 
inner join Order_Detail_A a on o.OrderID = a.OrderID and o.OrderDetails_A_ID is not null 
union all 
select o.OrderID, b.Qty_B as Qty 
from Orders o 
inner join Order_Detail_B b on o.OrderID = b.OrderID and o.OrderDetails_A_ID is null 
+0

'coalesce'實際上是錯誤的,當'Qty_A'連接並存在時將選擇'Qty_B',但是爲空。 – GSerg

+0

好吧,我忘了一件事,如果o.OrderDetails_A_ID是NULL,我只想從OrderDetails_A表中輸入第一個記錄,如果它不是NULL,而我想要OrderDetails_B中的所有記錄。我會解釋一下,但是我的腦子已經夠痛苦了,試圖破壞一個容易理解的應用程序。 –

+0

@GSerg,作爲連接的一部分,a和b都不能出現。如果OrderDetails_A_ID不爲空,則可以找到一行,否則只有b可以找到一行。 – Mitch

2
select 
    o.OrderDate, 
    o.OrderedByID, 
    case when o.OrderDetails_A_ID is null then b.ItemDesc_B else a.ItemDesc_A end as ItemDesc, 
    case when o.OrderDetails_A_ID is null then b.Qty_B else a.Qty_A end as Qty 
FROM 
    Orders as O 
    left join OrderDetails_A a on a.OrderID = o.OrderID and o.OrderDetails_A_ID is not null 
    left join OrderDetails_B b on b.OrderID = o.OrderID and o.OrderDetails_A_ID is null 
+0

我最終得到了以下內容,它給了我所需要的選擇h.headerid,h.dateordered, h.deliverylocation,coalesce(poi.itemdata,L.orderdetail)as order bym from header as H Inner join(select * from(select l。*,row_number()over(byadeade order by lineid分區)作爲lineitem的rn)as x其中rn = 1)作爲h上的L.headerid = l.headerid左邊的外部連接可作爲PO上的h.poid = po.poid left外部連接poitem作爲poi上的h.poid = poi.poid –

相關問題