0

给定

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作为参数的存储过程,找到与该名称匹配的父项(如果有),将该父项作为结果集返回,然后将该父项的任何子项作为单独的结果集返回。

我怎样才能有效地选择孩子?我目前的幼稚方法是

SELECT @id = FROM Parent WHERE Name = @name
SELECT * FROM Parent  WHERE Name = @name

SELECT * FROM Child WHERE ParentId=@id

我可以避免从 Parent 中选择两次吗?

4

3 回答 3

2

您的幼稚方法看起来不错,除了您没有 UNIQUE 约束Parent.Name,这意味着您可能有重复的父名称,但只会返回与您找到的第一个 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 的所有父母及其所有匹配的孩子。

于 2013-10-22T20:08:52.713 回答
1

您可以使用这样的连接,而永远不要选择 id。

SELECT * 
FROM Child c
JOIN Parent p on c.ParentId = P.Id
WHERE p.Name = @name
于 2013-10-22T20:07:49.280 回答
0

我完全同意乔的回答。

另一种解决方案是您可以将查找父级的结果保存在单独的变量中。

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
于 2013-10-22T20:40:31.970 回答