2013-10-22 46 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