2009-08-21 53 views
0

給定一個表,列,N1,N2,N3列,如何獲得滿足條件N1 + N2 + N3> 10的所有組合?如何獲得滿足條件的所有組合

例如,查詢表:

 N1  N2  N3 
Row1 1  5  4 
Row2 4  4  3 

應該給結果:

 N1  N2  N3 
Row1 4  5  4 
Row2 4  4  4 
Row3 4  4  3 
Row3 4  5  3 

我怎樣才能做到這一點的T-SQL?

+0

什麼用4/5/3的? – Bombe 2009-08-21 07:37:03

+0

是的,錯過了那一個。對不起 – erik 2009-08-21 09:13:06

回答

3

我還沒有測試過,但像這樣的東西應該工作。交叉加入會給你所有的組合,你過濾他們只返回那些滿足你的條件。 DISTINCT用於過濾可能發生的重複組合,即所有三列在一行中具有相同的值。

SELECT DISTINCT T1.N1, T2.N2, T3.N3 
FROM 
    (SELECT N1 FROM YourTable) AS T1 
     CROSS JOIN 
    (SELECT N2 FROM YourTable) AS T2 
     CROSS JOIN 
    (SELECT N3 FROM YourTable) AS T3 
WHERE T1.N1 + T2.N2 + T3.N3 > 10; 
+0

在這個例子中嵌套的選擇是不必要的,埃德哈珀的語法更簡單。 – 2010-08-17 19:39:59

1

如果我正確地理解了你,你想要N1,N2和N3的所有組合加起來> 10,而不管這些值出現在哪一行上。

create table #t 
(N1 int 
,N2 int 
,N3 int 
) 


insert #t 
select 1,5,4 
union select 4,4,3 


select n1.N1, n2.N2, n3.N3 
from #t as n1 
cross join #t as n2 
cross join #t as n3 
where n1.N1 + n2.N2 + n3.N3 > 10 
0

這是笛卡爾產品是有效答案的極少數例子之一。

我詢問,我試圖如下:

select distinct t1.t1, t2.t2, t3.t3 
from test t1, test t2, test t3 
where (t1.t1 + t2.t2 + t3.t3) > 10 

我不熟悉的交叉連接語法,但似乎都做工精細。

編輯:我發現這個說法爲「加入」語法:https://stackoverflow.com/questions/128965/is-there-something-wrong-with-joins-that-don't-use-the-join-keyword-in-sql-or-mys

+0

這是一個更現代的語法。正如你所說,指定沒有連接(就像你所做的那樣)給出了相同的結果 - 笛卡爾積。例如,如果你有三個表加入了內部B交叉C,那麼你更願意明確地交叉表明你知道發生了什麼。 – AakashM 2009-08-21 07:59:45

+0

謝謝AakashM。對於其他讀者,我刪除了第一條評論,詢問爲什麼要使用交叉連接並添加鏈接。 – 2009-08-21 08:04:25