我试图创建一个演示来解释如何加入并遇到一些困难。
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看到的内容。有任何想法吗?
最佳答案
这是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的问题。
关于mysql - mysql按名称将列分组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15036441/