比方說,我有以下SQL查詢:SQL內部聯接查詢返回兩個相同的列
SELECT *
FROM employee
INNER JOIN department ON employee.EmpID = department.EmpID
我要問,爲什麼我獲得兩個EmpID
列,我怎麼能得到的只有其中的一個,最好是第一個。
我使用SQL Server
比方說,我有以下SQL查詢:SQL內部聯接查詢返回兩個相同的列
SELECT *
FROM employee
INNER JOIN department ON employee.EmpID = department.EmpID
我要問,爲什麼我獲得兩個EmpID
列,我怎麼能得到的只有其中的一個,最好是第一個。
我使用SQL Server
SELECT employee.EmpID, employee.name, ...
FROM employee
INNER JOIN department ON employee.EmpID=department.EmpID
精確並指定您需要,而不是使用astrisk選擇所有列的列。
請勿使用*
。在字段列表中指定所需的列。
SELECT E.EmpID, E.EmpName -- etc
FROM employee as E
INNER JOIN department as D
ON E.EmpID=D.EmpID
我應該提到它之前,我知道它的工作原理,如果你指定所有列你想要的,但我想知道是否有任何其他方式得到這個沒有指定所有列 –
@user - 沒有沒有。 –
你得到所有列從所有表涉及您的查詢,因爲你問它: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
我應該提到它之前,我知道它的作品,如果你指定所有列你想要的,但我想知道是否有任何其他方式得到這個沒有指定所有的列 –
@ user765964:不 - 你使用' SELECT *',你得到**所有** - 或者你必須指定**你想要的** - 沒有別的辦法.. –
你得到的所有列來自這兩個表,這就是爲什麼你有兩個EmpID
列。刪除公共列的唯一JOIN
類型是NATURAL JOIN
,這不是由SQL Server實現的。您的查詢將如下所示:
SELECT *
FROM employee
NATURAL JOIN department
這會通過比較兩個表中具有相同名稱的所有列來生成連接謂詞。結果表只包含每對同名列的一列。
本質上,您的問題的答案是,SQL SELECT
查詢的輸出不是關係,因此如果您不小心,最終可能會得到重複的屬性名稱(列)和行。
標準SQL有一些構造來減輕SQL的非關係問題,例如NATURAL JOIN
將確保結果只有一個EmpID
屬性。可悲的是,SQL Server不支持這種語法,但您可以爲它投票here。
因此,您不得不長時間寫出您想要的列,使用表名來確定您喜歡哪個屬性,例如, employee.EmpID
。
我應該提到它之前,我知道它的作品,如果你指定所有列你想要的,但我想知道是否有任何其他方式得到這個沒有指定所有的列 –
不,沒有。 – Jacob