2009-10-23 42 views
0

我有以下SQL:如何從這個SQL語句刪除嵌套查詢

SELECT * FROM Name 
INNER JOIN (SELECT 2 AS item, NameInAddress.NameID as itemID, NameInAddress.AddressID 
     FROM NameInAddress 
     INNER JOIN Address ON Address.AddressID = NameInAddress.AddressID 
     WHERE (Address.Country != 'UK') 
) AS Items ON (Items.itemID = Name .Name ID) 

我被要求刪除的嵌套查詢和使用內部連接,而不是,因爲它會提高性能,但是我正在掙扎。

使用SQL Server 2008

任何人都可以幫忙嗎?

謝謝!

回答

4

您的查詢是不正確的,因爲你使用Items.itemID雖然它並不在子選擇

我想這是你的意思:

SELECT Name.* 
FROM Name 
INNER JOIN NameInAddress 
ON Name.NameID = NameInAddress.NameID 
INNER JOIN Address 
ON Address.AddressID = NameInAddress.AddressID 
WHERE (Address.Country != 'UK') 

編輯:您的查詢的確切翻譯將啓動與SELECT Name.*, 2 as Item, NameInAddress.NameID, NameInAddress.AddressID雖然

0
SELECT  2 AS Item, * 
FROM  Name 
INNER JOIN NameInAddress 
ON   Name.NameID = NameInAddress.NameID 
INNER JOIN Address 
ON   Address.AddressID = NameInAddress.AddressID 
WHERE  Address.Country != 'UK' 

PS:不要使用「*」。這也會增加性能。 :)

+2

不要在生產環境中使用「*」 - 我很想說「永遠」,但總有一個情況下,你能證明做一些通常被視爲錯誤的,爲什麼那麼peformance問題放在一邊?因爲改變你的模式可能有不可預見的後果,這將是更容易理解,如果你明確你所擷取的數據。 – Murph 2009-10-23 08:26:29

+0

好了,我找不到它是合理使用「*」任何情況下,你能告訴我一個? – 2009-10-23 09:03:51

+0

我曾在那裏的應用程序正在積極發展的情況下,新領域不斷被加入到表中,所以requiremen來自用戶的表格瀏覽屏幕形式明確地「向我展示此時的所有內容」。 – ttarchala 2009-10-23 10:08:17

1

這是那些嵌套的選擇比加入慢長壽神話之一。它完全取決於嵌套選擇說什麼。 SQL只是一種說明性的語言來告訴你想要做什麼,數據庫會將它轉換成完全不同的東西。無論MSSQL和甲骨文(我懷疑其他主要搜索引擎也一樣)是完全能夠改變相關子查詢和嵌套的意見納入連接,如果它是有益的(除非你做非常複雜的事情,會很辛苦,如果可能的話,正常來形容。加入