2011-08-23 83 views
3

比方說,我有以下SQL查詢:SQL內部聯接查詢返回兩個相同的列

SELECT * 
FROM employee 
INNER JOIN department ON employee.EmpID = department.EmpID 

我要問,爲什麼我獲得兩個EmpID列,我怎麼能得到的只有其中的一個,最好是第一個。

我使用SQL Server

回答

5
SELECT employee.EmpID, employee.name, ... 
FROM employee 
INNER JOIN department ON employee.EmpID=department.EmpID 

精確並指定您需要,而不是使用astrisk選擇所有列的列。

+0

我應該提到它之前,我知道它的作品,如果你指定所有列你想要的,但我想知道是否有任何其他方式得到這個沒有指定所有的列 –

+0

不,沒有。 – Jacob

0

請勿使用*。在字段列表中指定所需的列。

SELECT E.EmpID, E.EmpName -- etc 
FROM employee as E 
    INNER JOIN department as D 
    ON E.EmpID=D.EmpID 
+0

我應該提到它之前,我知道它的工作原理,如果你指定所有列你想要的,但我想知道是否有任何其他方式得到這個沒有指定所有列 –

+1

@user - 沒有沒有。 –

1

你得到所有列所有表涉及您的查詢,因爲你問它:SELECT *

如果只希望特定的列 - 你需要指定哪些你想:

SELECT e.EmpID, e.Name as 'Employee Name', d.Name AS 'Department Name' 
FROM employee e 
INNER JOIN department d ON e.EmpID = d.EmpID 
+0

我應該提到它之前,我知道它的作品,如果你指定所有列你想要的,但我想知道是否有任何其他方式得到這個沒有指定所有的列 –

+0

@ user765964:不 - 你使用' SELECT *',你得到**所有** - 或者你必須指定**你想要的** - 沒有別的辦法.. –

4

你得到的所有列來自這兩個表,這就是爲什麼你有兩個EmpID列。刪除公共列的唯一JOIN類型是NATURAL JOIN,這不是由SQL Server實現的。您的查詢將如下所示:

SELECT * 
FROM employee 
NATURAL JOIN department 

這會通過比較兩個表中具有相同名稱的所有列來生成連接謂詞。結果表只包含每對同名列的一列。

0

本質上,您的問題的答案是,SQL SELECT查詢的輸出不是關係,因此如果您不小心,最終可能會得到重複的屬性名稱(列)和行。

標準SQL有一些構造來減輕SQL的非關係​​問題,例如NATURAL JOIN將確保結果只有一個EmpID屬性。可悲的是,SQL Server不支持這種語法,但您可以爲它投票here

因此,您不得不長時間寫出您想要的列,使用表名來確定您喜歡哪個屬性,例如, employee.EmpID