给定一个表,列,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