2009-10-27 128 views
0

我與列 填充NameID 名稱 TYPEID如何刪除嵌套查詢語句

用下面的SQL名稱表

SELECT[NameID] 
FROM[Name] 
WHERE[TypeID] = @TypeID 
AND NameID >= (SELECT MIN([NameID]) 
       FROM [Name] 
       WHERE [Name]='Billy' AND [TypeID][email protected]) 

我一直要求將其轉換爲內部連接,而不使用任何嵌套的選擇,但不知道如何。 感謝您的幫助!

+2

子查詢evaulated只有一次(它不是一個相關子查詢)。它不應該是一個性能問題。我認爲編寫查詢的其他方式效率會更低。 – 2009-10-27 12:36:05

+0

這是一個練習嗎?爲什麼它被認爲需要重寫? – 2009-10-27 12:38:53

+0

Hi Lukas, 我剛剛被要求從我們的SQL腳本中刪除嵌套選擇,我沒有足夠的SQL背景來反駁爲什麼我不應該這樣做,因此發佈在這裏。 – Gribbler 2009-10-27 12:46:52

回答

1

本來我沒想到你需要加入所有,

;WITH n AS 
(
    SELECT 
     NameID, 
     rn = ROW_NUMBER() OVER (ORDER BY NameID) 
    FROM [Name] 
    WHERE TypeID = @TypeID 
    AND [Name] = 'Billy' 
) 
SELECT NameID 
    FROM n 
    WHERE rn > 1; 

再說,也許我沒有明確的要求。這個查詢的目的是什麼?

SELECT n1.NameID 
FROM [Name] AS n1 
    INNER JOIN 
(
    SELECT NameID = MIN(NameID) 
    FROM [Name] 
    WHERE TypeID = @TypeID 
    AND [Name] = 'Billy' 
) AS n2 
ON n1.NameID >= n2.NameID 
WHERE n1.TypeID = @TypeID; 

我與盧卡斯同意,我不知道爲什麼,是誰告訴你要改變人認爲這個內部聯接會比原來的更好。

+0

不是等價的,原始查詢將返回比Name ='Billy'更多的行。 – 2009-10-27 12:34:33

+0

是的,我想了解原始查詢的目的。 – 2009-10-27 12:39:04

+0

由於性能方面的原因,我被要求做這件事,我被告知Iner Join速度更快。 – Gribbler 2009-10-27 12:44:26

0

你可以通過刪除嵌套部分: -

DECLARE @NameID INT

選擇@NameID =(SELECT MIN([填充NameID]) 來自[NAME] WHERE [名稱] =」比利」 AND [TYPEID] = @ TYPEID)

SELECT [填充NameID] FROM [名稱] WHERE [TYPEID] = @TypeID AND填充NameID> = @NameID

但如前所述,這不會提供任何性能優勢,因爲子查詢只會在您的版本中評估一次,與此相同。

-2

好吧,它看起來像移動條件[Name]='Billy'應該產生相同的結果爲這個特定的查詢。所以,將您原創】

SELECT[NameID] 
FROM[Name] 
WHERE[TypeID] = @TypeID 
AND NameID >= (SELECT MIN([NameID]) 
        FROM [Name] 
        WHERE [Name]='Billy' AND [TypeID][email protected]) 

到:

SELECT[NameID] 
FROM[Name] 
WHERE[TypeID] = @TypeID 
AND[Name]='Billy' 
+0

那些評價答案(或者其他答案)的人會如此友善地指出邏輯錯誤和/或不回答問題的地方?乾杯。 – van 2009-10-28 11:02:11

+0

我測試了這個。 如果我有一個表 填充NameID TYPEID名稱 ------ ------ ---- 1 1比利 2約翰一書 3 1比利 4 1比利 – Gribbler 2009-10-28 12:39:14

+0

然後嵌套查詢返回1作爲值(當@TypeID爲1時) 查詢然後返回ID的1,2,3,4(即比利斯和約翰) 而您的查詢只返回1,3,4(比利斯) – Gribbler 2009-10-28 12:41:16