給定一個表,列,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?
給定一個表,列,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?
我還沒有測試過,但像這樣的東西應該工作。交叉加入會給你所有的組合,你過濾他們只返回那些滿足你的條件。 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;
在這個例子中嵌套的選擇是不必要的,埃德哈珀的語法更簡單。 – 2010-08-17 19:39:59
如果我正確地理解了你,你想要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
這是笛卡爾產品是有效答案的極少數例子之一。
我詢問,我試圖如下:
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
這是一個更現代的語法。正如你所說,指定沒有連接(就像你所做的那樣)給出了相同的結果 - 笛卡爾積。例如,如果你有三個表加入了內部B交叉C,那麼你更願意明確地交叉表明你知道發生了什麼。 – AakashM 2009-08-21 07:59:45
謝謝AakashM。對於其他讀者,我刪除了第一條評論,詢問爲什麼要使用交叉連接並添加鏈接。 – 2009-08-21 08:04:25
什麼用4/5/3的? – Bombe 2009-08-21 07:37:03
是的,錯過了那一個。對不起 – erik 2009-08-21 09:13:06