2010-11-12 47 views
0

我正在创建一个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)
SQL可能的笛卡尔连接

+1

隐含的语法不应该在任何查询更不用说复杂的使用。事实上,你必须提出这个问题是一个原因。如果您正在执行代码分析器,则应将任何隐式连接报告为不正确。 – HLGEM 2010-11-12 14:19:05

回答

3

不,这不是笛卡尔连接。这可能是一个糟糕的,但不是笛卡儿。

+0

感谢Octavia的快速回复。 – 2010-11-12 14:39:32

1

如果下面的查询被视为包含笛卡儿连接

我认为它是如此不加分析,和我没有要求的逗号它被rewriten。然后,我会要求它写入没有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 
+0

感谢David的快速回复。那么,如果代码分析器将查询标记为“可能包含笛卡尔连接”,你说什么? – 2010-11-12 14:39:59

+0

您的重写很好地说明了为什么'旧式'加入仍然保留在SQL标准中(并且可能总是会),也就是说,因为使用SQL-92中缀表示法来表示相同的联接要复杂得多(对于人类编码员来说)。 – onedaywhen 2010-11-12 15:10:20

+0

@onedaywhen,* shrug * - 当我看到t2。*时,我认为通过连接引入的重复是不可取的,我将恢复为过滤。查看我的最新编辑以获取更传统的JOIN(实际上它更易于编写/读取)。 – 2010-11-12 17:54:30