我试图创建一个演示来解释JOIN如何遇到一些困难。
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使用它自己的分组。原因是LEFT和RIGHT JOIN不关心你如何将数据显示在输出中 - 他们关心的是连接到RIGHT和LEFT的表。而且这并不能很好地扩展。我只想看看JOIN看到了什么。
有什么想法吗?
答案 0 :(得分:1)
这是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
应该是内部联接。笛卡尔积应使用cross 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的一个问题。