2017-09-22 85 views
2

我非常新的SQL和我遇到的東西,在我看來是一種奇怪的:選擇INNER JOIN失敗後

我有以下查詢:

SELECT id 
FROM Worker 
INNER JOIN Computer ON Worker.Id = Computer.Id 

很簡單的東西。這個查詢將失敗,但我認爲這個查詢失敗是違反直覺的。

該查詢將失敗,因爲我將有2列稱爲id。我可以作出書面查詢工作:

SELECT Worker.id 
FROM Worker 
INNER JOIN Computer ON Worker.Id = Computer.Id 

我的問題是:

爲什麼我的查詢需要我說明我想要的表從因爲

  1. 一點也沒有了ID」從哪個表我得到它的問題

  2. 我幾乎說,我希望它從'工人'表說SELECT Worker.id FROM Worker

,並有更好的方法來定義我想要的表從除了寫作SELECT Worker.id FROM Worker的ID,因爲我覺得,如果我的方式重複自己

回答

2

這是依賴於每個數據庫供應商如何處理他們的自己的查詢語法,但這裏是我的想法:

1) It doesn't matter from which table I get it

它可能不是在你的例子沒關係,但有關情況時,數據類型不匹配的內容(int/smallintdate/datetimeint/string)?或者如果您使用的是left/right join而不是inner join?在這些情況下,數據庫提供者將不得不作出選擇。


2) I pretty much stated that I want it from the 'worker' table by saying SELECT Worker.id FROM

是的,你可以使用表順序來解決歧義。這又是數據庫提供商可以做出的決定。


is there a better way to define what table I want the id from besides writing SELECT Worker.id FROM Worker because I feel as if I repeated myself in a way

我儘量避免使用inner joins過濾。相反,我會寫這樣的查詢:

SELECT id FROM Worker where id in (select id FROM Computer) 

SELECT id FROM Worker as w where exists (select 1 from Computer as c where c.id = w.id) 

(這些可能不會返回相同的結果作爲查詢,因爲inner join可能導致重複)

+0

感謝您的回覆!你能告訴我爲什麼你避免內部連接? – ViktorG

+0

@ViktorG - 我只在用於過濾時避免使用它們(您沒有從連接表中選擇任何列或在隨後的連接中使用它)。我覺得它使得查詢更具可讀性,避免爲查詢添加'distinct' – Aducci

+1

非常感謝:)讓我對它更加清楚! – ViktorG

0

This query will fail though and I think that this query failing is counterintuitive.

我認爲這很清楚爲什麼查詢會失敗。至少我還沒有看到數據庫實現不會失敗(MySQL將失敗並顯示消息「列ID不明確」,PostgreSQL將失敗並顯示消息「錯誤:列引用」ID「不明確」,MS- SQL將陳述非常相似的東西),但可能存在不會失敗的實現。

Why does my query require me to state what table I want the id from.

因爲列id存在於兩個表中。

1) It doesn't matter from which table I get it

這就是你說的,但數據庫應該怎麼知道?假設你在兩張表中有時間戳(我們稱它們爲table_Atable_B),指示何時將一條記錄插入表中。現在你告訴DB:「嘿,加入table_Atable_B,哦,請給我時間戳!」

數據庫應該如何知道你的意思是哪個時間戳?

2) I pretty much stated that I want it from the 'worker' table by saying SELECT id FROM Worker

你說你想從工人數據,與數據從加盟計算機!通過將兩個表連接在一起,您將得到一張表。如果在多個表中出現行名稱,則必須明確指出每行來自哪裏。讓我們再回到前面的例子,如果table_A有一個名爲FILE_SIZEtable_B行不,那是不夠的說

SELECT file_size 
FROM table_A 
    JOIN table_B on table_A.id = table_B.id 

,因爲只有與這個名字一列。

and is there a better way to define what table I want the id from besides writing SELECT Worker.id FROM Worker because I feel as if I repeated myself in a way

從另一個建議possiblitly -apart Aducci作出─將使用別名,就像這樣:

SELECT w.id 
FROM Worker AS w 
    INNER JOIN Computer AS c ON w.Id = c.Id 

這樣你就不必鍵入出整個表名每時間。

1

在SQL Server中,請特別注意這個查詢。

DECLARE @var1 date ='01/01/2017' 
DECLARE @Var2 varchar(20)='01/01/2017' 

if (@[email protected]) 
BEGIN 
    select 'match' 
END 

結果是它說因爲隱式數據轉換而匹配。 SQL引擎如何知道在像這樣的實例中提供哪個值?就我個人而言,我喜歡它需要該特定產品中的別名。