从存储过程返回父和子

时间:2013-10-22 20:01:33

标签: sql sql-server

鉴于

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

我可以避免从父母那里选择两次吗?

3 个答案:

答案 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