2013-10-22 40 views
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 [email protected] 

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

回答

1

你幼稚的做法看起来不错,但你没有唯一约束Parent.Name,这意味着你可以有重复的父母的名字,但将只返回匹配的孩子找到的第一个ID。也有是你的第一选择一个语法错误,这应该是:

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及其所有匹配的孩子。

+0

真正的表具有UNIQUE约束,但感谢您指出了这一点。 INNER JOIN对我来说似乎是一个更好的方法。 –

1

您可以使用像这样的连接,并且永远不会选择该ID。

SELECT * 
FROM Child c 
JOIN Parent p on c.ParentId = P.Id 
WHERE p.Name = @name 
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