2015-12-02 49 views
1

我有以下代碼來檢索並顯示也是編輯器(ED_ID = WRT_ID)的編寫者的名字和姓氏。如何在SQL中使用JOIN編寫子查詢

SELECT Writers.WRT_LastName AS LastName, Writers.WRT_FirstName AS FirstName 
FROM Writers INNER JOIN Editors ON Editors.ED_ID = Writers.WRT_ID; 

它會產生我想要的結果,但是如何使用子查詢編寫它併產生相同的結果呢?

我使用Access 2013

讓我知道如果我需要提供更多的信息。

回答

1

想必,你不想重複的結果。我指出,因爲如果Editors表具有重複項,子查詢將與join不同。

寫這個的典型方法是使用INEXISTS。我傾向於使用後者,雖然兩者通常在性能上相當相當(另一方面,NOT EXISTS優於語義上的NOT IN)。

SELECT Writers.WRT_LastName AS LastName, Writers.WRT_FirstName AS FirstName 
FROM Writers 
WHERE EXISTS (SELECT 1 FROM Editors WHERE Editors.ED_ID = Writers.WRT_ID); 
+0

因此,如果一個如果表是重複的,我應該使用EXISTS而不是IN? – Ddrossi93

+0

和SELECT 1在子查詢中做了什麼? – Ddrossi93

+0

@ Ddrossi93。 。 。 'EXISTS'只是檢查一行的存在。 '1'是任意的。 'EXISTS'和'IN'做同樣的事情。如果'Editors'中有重複的作者,'JOIN'可以產生重複。 WHERE條件中的條件不會重複結果,所以結果集並不總是相同的。 –

1

你只需要把連接條件爲where子句子查詢:

SELECT WRT_LastName as LastName, WRT_FirstName as FirstName 
FROM WRITERS 
WHERE WRT_ID in (SELECT ED_ID FROM EDITORS) 
+0

工作。謝謝。這是如何在用子查詢替換JOIN時始終如何工作的? – Ddrossi93

+0

是的。你只需要匹配邏輯。在連接查詢中,您正在使用連接從WRITERS表中過濾掉EDITORS表中沒有匹配的ED_ID的WRT_ID。將相同的邏輯轉移到where子句,並具有子查詢版本。 –

+0

太棒了。非常感謝。 – Ddrossi93