我试图创建一个演示来解释如何加入并遇到一些困难。

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/

10-11 03:18
查看更多