我正在创建一个SQL静态代码分析器。 应该将以下查询视为包含笛卡尔连接: select t2.*
SQL可能的笛卡尔连接
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)
回答
不,这不是笛卡尔连接。这可能是一个糟糕的,但不是笛卡儿。
感谢Octavia的快速回复。 – 2010-11-12 14:39:32
如果下面的查询被视为包含笛卡儿连接
我认为它是如此不加分析,和我没有要求的逗号它被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
感谢David的快速回复。那么,如果代码分析器将查询标记为“可能包含笛卡尔连接”,你说什么? – 2010-11-12 14:39:59
您的重写很好地说明了为什么'旧式'加入仍然保留在SQL标准中(并且可能总是会),也就是说,因为使用SQL-92中缀表示法来表示相同的联接要复杂得多(对于人类编码员来说)。 – onedaywhen 2010-11-12 15:10:20
@onedaywhen,* shrug * - 当我看到t2。*时,我认为通过连接引入的重复是不可取的,我将恢复为过滤。查看我的最新编辑以获取更传统的JOIN(实际上它更易于编写/读取)。 – 2010-11-12 17:54:30
- 1. 笛卡尔积SQL
- 2. 什么可能导致合并笛卡尔连接
- 3. 两个数组的笛卡尔连接
- 4. 连接和移除笛卡尔积
- 5. 替代笛卡尔和交叉连接
- 6. MS Access的SQL - 多个连接与AND给笛卡尔产品?
- 7. SQL连接获得2列的笛卡尔积了3列
- 8. PL/SQL笛卡尔加入
- 9. SQL笛卡尔加入
- 10. 使用笛卡尔连接优化sql查询
- 11. Lazyhighchart笛卡尔
- 12. 笛卡尔积
- 13. 合并连接笛卡尔:我可以找到缺少的WHERE连接条件?
- 14. 笛卡尔连接多重外连接到公共根
- 15. DStream的笛卡尔
- 16. 使用sql server的笛卡尔积
- 17. Sql Server的意外笛卡尔乘积
- 18. SQL:避免笛卡尔乘积的usauge
- 19. SQL不需要的笛卡尔积
- 20. 了解SQL中的笛卡尔积
- 21. 笛卡尔积Ruby
- 22. 笛卡尔平面
- 23. AWK笛卡尔积
- 24. 笛卡尔积 - PHP
- 25. 笛卡尔积VBA
- 26. RxJs笛卡尔积
- 27. SQL查询返回笛卡尔积
- 28. SAS PROC SQL生成笛卡尔积
- 29. 在Python中快速笛卡尔到极坐标到笛卡尔
- 30. 简单的SELECT查询导致笛卡尔连接?
隐含的语法不应该在任何查询更不用说复杂的使用。事实上,你必须提出这个问题是一个原因。如果您正在执行代码分析器,则应将任何隐式连接报告为不正确。 – HLGEM 2010-11-12 14:19:05