我有一个名称表,其中包含列NameID Name TypeID
使用以下SQL
SELECT[NameID]
FROM[Name]
WHERE[TypeID] = @TypeID
AND NameID >= (SELECT MIN([NameID])
FROM [Name]
WHERE [Name]='Billy' AND [TypeID]=@TypeID) 我被要求在不使用任何嵌套select的情况下将其转换为内连接,但不确定如何转换。谢谢你的帮忙!
发布于 2009-10-27 20:32:03
一开始我觉得你根本不需要加入,
;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的观点,我不确定为什么告诉你改变这一点的人会认为内部连接会比你的原始连接更好。
发布于 2009-10-27 21:15:01
您可以通过以下方式删除嵌套部分:-
声明@NameID整型
select @NameID = (SELECT MIN(NameID) FROM Name WHERE Name='Billy‘AND TypeID=@TypeID)
从名称中选择NameID,其中TypeID =@类型AND,NameID >= @名称AND
但如前所述,这不会提供任何性能优势,因为子查询在您的版本中只会被评估一次,与下面的版本相同。
发布于 2009-10-27 21:35:22
嗯,看起来只是移动条件[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'https://stackoverflow.com/questions/1630461
复制相似问题