Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 交叉连接是没有ON子句的内部连接的同义词吗?_Sql_Inner Join_Cross Join - Fatal编程技术网

Sql 交叉连接是没有ON子句的内部连接的同义词吗?

Sql 交叉连接是没有ON子句的内部连接的同义词吗?,sql,inner-join,cross-join,Sql,Inner Join,Cross Join,我想知道交叉连接是否可以在任何查询中安全地替换为内部连接 不带的内部联接是否与使用的交叉联接完全相同?如果是,是否发明了交叉连接类型只是为了在查询中更好地表达意图 这一问题的附录是: 当使用交叉连接时,使用现代和广泛使用的DBMS会有区别吗。。。其中x,内部联接。。。在(x)或内部联接上。。。其中(x) 谢谢。在所有现代数据库中,所有这些结构都根据相同的计划进行了优化 某些数据库(如SQL Server)在内部联接之后需要打开条件,因此您的第三个查询不会在那里进行解析 表的可见性范围是按JOIN

我想知道
交叉连接
是否可以在任何查询中安全地替换为
内部连接

不带
内部联接
是否与使用
交叉联接
完全相同?如果是,是否发明了
交叉连接
类型只是为了在查询中更好地表达意图

这一问题的附录是:

当使用
交叉连接时,使用现代和广泛使用的DBMS会有区别吗。。。其中x
内部联接。。。在(x)
内部联接上。。。其中(x)


谢谢。

在所有现代数据库中,所有这些结构都根据相同的计划进行了优化

某些数据库(如
SQL Server
)在
内部联接之后需要
打开
条件,因此您的第三个查询不会在那里进行解析

表的可见性范围是按
JOIN
顺序排列的,因此此查询:

SELECT  *
FROM    s1
JOIN    s2
ON      s1.id IN (s2.id, s3.id)
CROSS JOIN
        s3
将不分析,而此:

SELECT  *
FROM    s2
CROSS JOIN
        s3
JOIN    s1
ON      s1.id IN (s2.id, s3.id)

will.

原始交叉联接是一种没有where子句的联接,这意味着对于正在联接的左表和右表的每个组合,都会生成一条记录,并在没有左侧或右侧数据的情况下插入空值

如果将where子句添加到交叉联接中,这将使其等效于内部联接,因为where子句在内部联接中的作用与ON相同


但是,使用内部联接通常更好,因为这样可以将ON条件与where子句的其余部分分开,从而更易于理解。

谢谢您的回答。根据
内部连接标准
s,是否必须满足
开启条件?@Benoit:根据
SQL-92
,不是。不过,我手边没有一本2003年或2008年的。除了
MySQL
之外的所有数据库都需要它。@Benoit:我是说“四大数据库”,对不起:)@Quassnoi:这是指Oracle、MySQL、PostgreSQL和SQL Server吗?在第二个版本的查询中,我想你指的是“来自s2”。它不会按原样解析。可以说值得投反对票(这不是我的),但这是一个简单的解决办法。在你的第一段中,你混淆了交叉连接和外部连接。与空表交叉连接将产生空结果。