鉴于
CREATE TABLE Parent (
Id INT IDENTITY(1,1) NOT NULL
Name VARCHAR(255)
SomeProp VARCHAR(255)
)
CREATE TABLE Child (
Id INT IDENTITY(1,1) NOT NULL
ParentId INT NOT NULL
ChildA VARCHAR(255)
ChildZ VARCHAR(255)
)
我希望编写一个接受@name
作为参数的存储过程,找到匹配该名称的Parent(如果有的话),将该Parent作为结果集返回,然后将该Parent的所有子项作为单独的结果集。
如何有效地选择孩子?我目前的天真方法是
SELECT @id = FROM Parent WHERE Name = @name
SELECT * FROM Parent WHERE Name = @name
SELECT * FROM Child WHERE ParentId=@id
我可以避免从父母那里选择两次吗?
答案 0 :(得分:1)
你可以使用这样的连接,永远不要选择id。
SELECT *
FROM Child c
JOIN Parent p on c.ParentId = P.Id
WHERE p.Name = @name
答案 1 :(得分:1)
您的天真方法看起来没问题,除了您在Parent.Name
上没有UNIQUE约束,这意味着您可能有重复的父名称,但只会返回与您找到的第一个ID匹配的子项。您的第一个SELECT也存在语法错误,应该是:
SELECT @id = Id FROM Parent WHERE Name = @name
另一种选择是:
SELECT * FROM Parent
WHERE Name = @Name
ORDER BY Name
SELECT Child.*
FROM Child C INNER JOIN PARENT P ON C.ParentId = P.Id
WHERE P.Name = @Name
ORDER BY P.Name
将返回名称为@Name及其所有匹配子项的所有父项。
答案 2 :(得分:0)
我完全赞同乔的回答。
另一个解决方案是您可以在单独的变量中保存查找Parent的结果。
SELECT @id = Id, @someprop = SomeProp FROM Parent WHERE Name = @name
IF @id IS NOT NULL -- means that we found something
SELECT @id, @name, @someprop
SELECT * FROM Child WHERE ParentId = @id