我有一个包含列的名称表 填充NameID 名称 TYPEID
使用以下SQL
SELECT[NameID]
FROM[Name]
WHERE[TypeID] = @TypeID
AND NameID >= (SELECT MIN([NameID])
FROM [Name]
WHERE [Name]='Billy' AND [TypeID]=@TypeID)
我被要求将其转换为内部连接而不使用任何嵌套选择但不确定如何。 谢谢你的帮助!
答案 0 :(得分: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;
我同意Lukas的观点,我不确定告诉你改变这种情况的人为什么认为内部联接会比原来更好。
答案 1 :(得分:0)
您可以通过以下方式删除嵌套部分: -
声明@NameID int
选择@NameID =(SELECT MIN([NameID]) FROM [Name] WHERE [Name] ='Billy'AND [TYPEID] = @ TYPEID)
SELECT [NameID] FROM [Name] WHERE [TypeID] = @TypeID AND NameID> = @NameID
但是如前所述,这并没有提供任何性能优势,因为子查询只会在您的版本中进行一次评估,与此相同。
答案 2 :(得分:-2)
好吧,看起来只是移动条件[Name]='Billy'
应该为此特定查询产生相同的结果。所以转换你的原文:
SELECT[NameID]
FROM[Name]
WHERE[TypeID] = @TypeID
AND NameID >= (SELECT MIN([NameID])
FROM [Name]
WHERE [Name]='Billy' AND [TypeID]=@TypeID)
为:
SELECT[NameID]
FROM[Name]
WHERE[TypeID] = @TypeID
AND[Name]='Billy'