2009-08-21 81 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