0

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

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 看到了什么。

有任何想法吗?

4

1 回答 1

1

这是 MySQL 的一个特性。具有相同名称的列在输出时“组合”成单个列。我不相信这是符合 ANSI 的行为。

要演示连接,请尝试以下操作:

select s1.id as id1, s2.id as id2
FROM sample s1 cross join
     sample s2;

这将重命名列,因此两者都出现在输出中。另外,我将其重命名joincross 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 的问题。

于 2013-02-23T02:52:11.967 回答