SQL可能的笛卡尔连接

时间:2010-11-12 14:11:48

标签: sql database

我正在创建一个SQL静态代码分析器。 是否应将以下查询视为包含笛卡尔联接: select t2.*
from test1 t1,
test2 t2,
test3 t3
where (t1.col1 = t2.col2
and t2.col3 = t3.col4)
or
(t1.col1 = t3.col2
and t2.col2 = t1.col1)

2 个答案:

答案 0 :(得分:3)

不,这不是笛卡儿联盟。它可能是一个坏的但不是笛卡尔。

答案 1 :(得分:1)

  

以下查询是否应被视为包含笛卡儿联接

如果没有分析,我会认为是这样,我要求在没有逗号的情况下重写它。然后我要求它写成没有OR。

这就是:

select t2.*
from test2 t2
where t2.col2 in (SELECT t1.col1 FROM test1 t1 WHERE t1.col1 is not null)
  and t2.col3 in (SELECT t3.col4 FROM test3 t3 WHERE t3.col4 is not null)
UNION
select t2.*
from test2 t2
where t2.col2 in (SELECT t1.col1 FROM test1 t1 WHERE t1.col1 is not null)
  and t2.col2 in (SELECT t3.col2 FROM test3 t3 WHERE t3.col2 is not null)

传统上更为传统:

select t2.* 
from test2 t2 
  JOIN test1 t1 ON t1.col1 = t2.col2
  JOIN test3 t3 ON t2.col3 = t3.col4
UNION 
select t2.* 
from test2 t2 
  JOIN test1 t1 ON t1.col1 = t2.col2
  JOIN test3 t3 ON t2.col2 = t3.col2