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

親から 2 回選択することを避けることはできますか?

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

私はジョーの答えに完全に同意します。

もう 1 つの解決策は、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
于 2013-10-22T20:40:31.970 に答える