2009-05-26 53 views
0

我有一個表編寫SQL查詢,其中一個值映射到所有可能的值

一個

name num 
------------ 
A  1 
B  0 
C  3 

num  marks 
--------------- 
1  90 
3  40 

查詢:??

結果:

name marks 
-------------- 
A  90 
C  40 
B  90 
B  40 

因此數字 「0」 表A對應於所有NUM列值。有沒有這種查詢可以寫成

一種方法,我知道要得到這個

name marks 
-------------- 
A  90 
C  40 

我們可以做到這一點

select A.name, B.marks from A,B where A.num = B.num; 

編輯:在這種情況下,0映射到NUM值1和3

回答

5

如何:

SELECT A.name, B.marks FROM A, B WHERE A.num = 0 OR A.num = B.num 
0
select A.name, B.marks from A,B where A.num = B.num or A.num=0; 

也許?

2
select a.name, b.marks from a join b on a.num = b.num 
union all 
select a.name, b.marks from a, b where a.num = 0 

可以發現這個效果要比在那裏用「OR」的條款更好。雖然說實話,你可能沒有,但是沒有辦法繞過A和B的整體。但是,查詢計劃人員爲您將「或」條件分解爲工會通常很有幫助。

編輯:

只是想擴大這一點。這樣做的原因可能是有利的,如果兩個部分的工會受益於完全不同的方式。例如,第二部分可以通過查找with(num = 0)中的所有行開始,而第一部分可能更適合於對b進行a和索引查找/哈希查找的全面掃描,或者合併(num)和b(num)。

我也會說這個查詢來自可疑的設計。從(num)到b(num),你不能有一個外鍵約束,即使它有意義,因爲(a.num = 0)不會匹配b中的任何行。如果你在b中添加了行(num = 0,marks = 90)和(num = 0,marks = 40),那麼你的查詢可以用一個簡單的內連接輕鬆寫出。雖然這是真的,但這意味着爲每個可能的標記維護兩行,可以使用觸發器來檢測插入的值是否爲num的非零值,並執行num = 0的附加插入操作。我想每種方法都有優點和缺點。但我真的很喜歡把數據庫中的fkey約束放在數據庫中,而不讓它們在這種情況下會讓我感到緊張 - 如果a中的記錄得到的數字不是b,會發生什麼?如果b中的一行被刪除會發生什麼?

+0

1,改變或進入UNION(或VV)通常是有用的技術。 – 2009-05-26 23:51:52

0
SELECT A.name 
     ,B.marks 
FROM dbo.so913112_A AS A 
INNER JOIN dbo.so913112_B AS B 
     ON A.num = B.num 
      OR A.num = 0 

給出:

name marks 
---- ----------- 
A 90 
B 90 
B 40 
C 40 

(4 row(s) affected) 
0
select a.name,b.marks 
from a,b 
where a.Num=b.num or a.num=0 
相關問題