2009-10-23 25 views
0

如何將以下內容轉換爲使用INNER JOIN而不是嵌套SELECT?將嵌套選擇轉換爲WHERE ..或..到INNER JOINS

SELECT 
    [Name].[NameValueID], 
    [Name].[NameTypeID], 
    [Name].[NameID], 
    [Name].[Value] 
FROM [Name] 
WHERE Name.NameTypeID IN (SELECT NameTypeID FROM @tbNameType) 
    OR Name.NameID IN (SELECT NameID FROM @tbName) 

回答

3

這是一個棘手的因爲它是一個「或」條件,而不是「與」。但我認爲,這將做到這一點:

SELECT 
     [Name].[NameValueID], 
     [Name].[NameTypeID], 
     [Name].[NameID], 
     [Name].[Value] 
FROM [Name] 
INNER JOIN (SELECT NameTypeID FROM @tbNameType) t ON t.NameTypeID=Name.NameTypeID 

UNION 

SELECT 
     [Name].[NameValueID], 
     [Name].[NameTypeID], 
     [Name].[NameID], 
     [Name].[Value] 
FROM [Name] 
INNER JOIN (SELECT NameID FROM @tbName) t ON t.NameID = Name.NameID 
+0

哇,這是快..我給它一個爆炸! – Gribbler 2009-10-23 14:07:18

+2

這會做到這一點...但它看起來很笨拙,比原來的查詢要多得多。爲什麼它*有*是內連接?對於性能,我會嘗試一些外部連接,或者可能不是存在的類。 – 2009-10-23 14:13:46

+0

它不必是一個iner join,但我被要求刪除Where In語句並使用INNER JOINS來代替,我猜如果有更合適的東西使用不同的join,那麼我可以使用它。 我只是在學習SQL,發現它有點棘手! – Gribbler 2009-10-23 14:20:12

3
SELECT DISTINCT 
    Name.NameValueID, 
    Name.NameTypeID, 
    Name.NameID, 
    Name.Value 
FROM 
    Name 
    LEFT JOIN @tbNameType a ON a.NameTypeID=Name.NameTypeID 
    LEFT JOIN @tbName b ON b.NameID=Name.NameID 
WHERE a.NameTypeID IS NOT NULL OR b.NameID IS NOT NULL 
+0

嗨, 謝謝,我決定在我的代碼中使用這個,雖然其他答案被標記爲答案,因爲這是我問的問題! 對不起! – Gribbler 2009-10-23 14:31:34

+0

我知道,我發佈它只是因爲它應該比內部連接+聯合更高效。 – 2009-10-23 14:43:36