SQL CROSS JOIN问题

时间:2011-02-23 20:37:32

标签: c# .net sql sql-server cross-join

我的SQL查询有点麻烦。

我有两张桌子:

表1

id  guid  title     D0      D1     D2
-----------------------------------------
1   guid1 Title1    0.123  -0.235  0.789
2   guid2 Title2   -0.343   0.435  0.459
3   guid3 Title3    0.243  -0.267 -0.934
...
100 guid4 Title100 -0.423   0.955  0.029

和表2(注意它具有相同的模式,只是不同的数据)。

id  guid  title     D0      D1     D2
----------------------------------------
1   guid1 Title1    0.233  -0.436 -0.389
2   guid2 Title2   -0.343   0.235  0.789
3   guid3 Title3    0.573  -0.067 -0.124
...
100 guid4 Title100 -0.343   0.155  0.005

我想弄清楚如何编写SELECT语句,该语句返回所有标题WHERE ABS(Table1_D0*Table2_D0)+ABS(Table1_D1*Table2_D1)+ABS(Table1_D2*Table2_D2)的所有组合都小于阈值(可能是硬编码)。

到目前为止,我正在尝试使用CROSS JOIN,但我不确定这是否是正确的做法。

这有意义吗? Table1,第1行针对Table2的所有行,然后 Table1,row2针对Table2的所有行

如果重要,我正在使用MS SQL。

非常感谢! 布雷特

4 个答案:

答案 0 :(得分:6)

SELECT t1.title
FROM Table1 t1
CROSS JOIN table2 t2
WHERE ABS(t1.D0*t2.D0)+ABS(t1.D1*t2.D1)+ABS(t1.D2*t2.D2)<10

答案 1 :(得分:0)

CROSS JOIN是正确的选择,CROSS JOIN与完全没有加入相同(请参阅Snowbear答案)。

答案 2 :(得分:0)

SELECT *
  FROM  Table1 a inner join
        Table2 b on a.Id=b.Id
where   ABS(a.D0*b.D0)+ABS(a.D1*b.D1)+ABS(a.D2*b.D2)<=@Value

答案 3 :(得分:0)

select t1o.title
from Table1 t1o
where not exists
(
    -- none of the cross-joined rows for t1o must be above the threshold
    select t1.title
    from Table1 t1
    cross join Table2 t2
    where t1.id = t1o.id -- only the cross joined rows for the current t1o row
    -- inverted b/c not exists
    and abs(t1.D0*t2.D0)+abs(t1.D1*t2.D1)+abs(t1.D2*t2.D2) > 10 
)