我试图创建一个演示来解释如何加入,但遇到了一些困难。
CREATE TABLE sample (
id INT
);
INSERT INTO sample VALUES (1),(2),(3),(4);
这是我的架构。
SELECT *
FROM sample AS s1
JOIN sample AS s2;
如果你这样做,你会得到这个:
1,1
1,2
1,3
1,4
2,1
2,2
...
4,3
4,4
至少 JOIN 看到的是这样的。但是,如果您尝试运行它,您会得到一列,其值等于第一列。我不想要这样 - 我想要两列。
我可以用s1.*, s2.*
代替*
,但是我希望SQL使用它自己的分组。原因是左连接和右连接不关心数据如何出现在输出中 - 它们只关心连接到右连接和左连接的表。而且这并不能很好地扩展。我只是想看看 JOIN 看到了什么。
有什么想法吗?
最佳答案
这是 MySQL 的一个特性。具有相同名称的列在输出时被“组合”成单个列。我不认为这是符合 ANSI 的行为。
要演示连接,请尝试以下操作:
select s1.id as id1, s2.id as id2
FROM sample s1 cross join
sample s2;
这会重命名列,因此两者都会出现在输出中。另外,我将 join
重命名为 cross join
。在 MySQL 中,join
可用于常规联接或笛卡尔积,具体取决于 on
子句的存在。我发现这种行为令人困惑。 join
应该是内部联接。笛卡尔积应使用交叉连接
。
这在 SQLFiddle 上似乎很奇怪。当我在 SQL Fiddle for SQL Server 上运行此代码时,我得到了与您相同的结果。但是,当我在本地 SQL Server 上运行此代码时,我得到两列:
CREATE TABLE sample (
id INT
);
INSERT INTO #sample VALUES (1),(2),(3),(4);
SELECT *
FROM sample AS s1
cross JOIN sample AS s2;
这似乎是 SQL Fiddle 的问题。
关于mysql 按名称将列分组在一起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15036441/