2013-02-23 35 views
0

我試圖創建一個演示來解釋如何加入並遇到一些困難。mysql按名稱將列分組在一起

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

任何想法?

+0

你想看什麼? – 2013-02-23 02:46:29

+0

你期望什麼結果? – Oliver 2013-02-23 02:48:05

+0

我想看到兩行 - 不是一行。我可以做s1。*,s2。*但我不想像我在最後一段中解釋的那樣。戈登答案解釋說,MySQL結合具有相同名稱的列。 – neubert 2013-02-23 03:15:34

回答

1

這是MySQL的一個特點。具有相同名稱的列在輸出中「合併」爲單個列。我不相信這是符合ANSI的行爲。

爲了演示連接,試試這個來代替:

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

這將重命名列,所以都出現在輸出。另外,我將join更名爲cross join。在MySQL中,根據on子句的存在,join可用於常規加入或笛卡爾積。我發現這種行爲混亂。 join應該是內部連接。笛卡爾產品應使用cross join

這似乎是SQLFiddle上的一種奇怪現象。當我在SQL Fiddle上爲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小提琴的問題。

+0

似乎它是所有SQL數據庫的特性:(在sqlfiddle.com上,我使用PostgreSQL,MySQL,SQLite和MS SQL來試用它,並且每次都得到相同的結果,我不想做s1,s2,因爲我想要看看SQL如何排序表列 - 而不是我怎麼做。我的意思是,交叉連接會產生s1。*,s2。*而不是s2。*,s1。*是true,但我只是假設SQL告訴我,而不是硬編碼。 – neubert 2013-02-23 03:40:08

相關問題