2013-03-05 56 views
0

我有三張我需要加入的表。在'ON'子句中使用'case function'

表1具有列id,Name,idObject,lineItem。 表2具有列id,City,idLineItem,idOrder,idSupplier,idAdv。 表3的列idAdv,狀態。

我的查詢是:

select Table1.id, Table1.Name, Table1.idObject, Table2.City, Table3.State 
from Table1 
join Table2 ON case 
       when Table1.Name='abc' then Table1.idObject=Table2.idLineItem 
       when Table1.Name='def' then Table1.idObject=Table2.idOrder 
       else Table1.idObject=Table2.idSupplier 
       end 
join Table3 on Table2.idAdv=Table3.idAdv 
group by Table1.id, Table1.idObject; 
+3

您確實有疑問? – 2013-03-05 00:46:13

+0

即使這可以與'case'語句或其他邏輯一起使用,它也是錯誤數據庫模式設計的查詢特徵。 – 2013-03-05 01:26:40

回答

1

case語句只能返回一個值,所以你必須將你相比的情況之外。事情是這樣的:

select Table1.id, Table1.Name, Table1.idObject, Table2.City, Table3.State 
from Table1 
join Table2 ON Table1.idObject = case 
       when Table1.Name='abc' then Table2.idLineItem 
       when Table1.Name='def' then Table2.idOrder 
       else Table2.idSupplier 
       end 
join Table3 on Table2.idAdv=Table3.idAdv 
group by Table1.id, Table1.idObject; 
+0

作爲比較的結果,OP case語句不會返回適當的布爾類型嗎? – 2013-03-05 00:50:32

+0

這些不是布爾比較,它們是連接條件,它們不返回任何內容。 – 2013-03-05 00:53:09

+1

如果他想做布爾比較,他需要做一些事情,比如在Table1.name ='abc'和Table1.idObject = Table2.idLineItem的情況下,連接Table2 on case 1 then .. etc ... else 0結束。 – 2013-03-05 00:54:01

1

可能..

select Table1.id, Table1.Name, Table1.idObject, Table2.City, Table3.State 
from Table1 
join Table2 ON 
    (Table1.Name='abc' and Table1.idObject=Table2.idLineItem) 
OR (Table1.Name='def' and Table1.idObject=Table2.idOrder) 
OR (Table1.Name <> 'abc' and Table1.Name <> 'def' and Table1.idObject=Table2.idSupplier) 
join Table3 on Table2.idAdv=Table3.idAdv 
group by Table1.id, Table1.idObject; 

更好的檢查執行計劃,雖然。

0

我不知道你是否可以在連接子句中使用CASE,但在這種情況下沒有理由。只需使用常規邏輯。

select Table1.id, Table1.Name, Table1.idObject, Table2.City, Table3.State 
from Table1 
join Table2 ON 
       (Table1.Name='abc' AND Table1.idObject=Table2.idLineItem) 
       OR (Table1.Name='def' AND Table1.idObject=Table2.idOrder) 
       OR (Table1.Name != 'abc' AND Table1.Name != 'def' AND Table1.idObject=Table2.idSupplier) 
join Table3 on Table2.idAdv=Table3.idAdv 
group by Table1.id, Table1.idObject;