2016-05-20 12 views
0

私のクエリを構成する助けが必要です。私はサブクエリが必要だと思うが、私はそれを私の文脈でどのように使うべきかについてはあまりよく分かっていない。 、私は一種の何が起こっているかを理解し、私は、次のテーブルとデータを持っている、私のクエリからの出力はあまり適切ではないかもしれませんが、おそらくサブクエリですか?

people 
ID, Name 
1, David 
2, Victoria 
3, Brooklyn 
4, Tom 
5, Katie 
6, Suri 
7, Kim 
8, North 
9, Kanye 
10,James 
11,Grace 


relationship 
peopleID, Relationship, relatedID 
3,Father,1 
3,Mother,2 
6,Father,4 
6,Mother, 5 
8,Mother,7 
8,Mother,9 
11,Father,10 

私は次のクエリ

SELECT DISTINCT p.ID, p.name, f.ID, f.name, m.ID, m.name 
FROM people AS p 
LEFT JOIN relationship AS fr ON p.ID = fr.peopleID 
LEFT JOIN people AS f ON fr.relatedID = f.ID 

LEFT JOIN relationship AS mr ON p.ID = mr.peopleID 
LEFT JOIN people AS m ON mr.relatedID = m.ID 
WHERE p.ID IN(3,6,8,11) 
AND (
    mr.Relationship IN('Mother','Stepmother') 
OR fr.Relationship IN('Father','Stepfather') 
    ) 

上記のクエリは次のようなデータに

3,Brooklyn,1,David,1,David 
3,Brooklyn,1,David,2,Victoria 
3,Brooklyn,2,Victoria,2,Victoria 
6,Suri,4,Tom,4,Tom 
6,Suri,4,Tom,5,Katie 
6,Suri,5,Katie,5,Katie 
8,North,7,Kim,7,Kim 
8,North,9,Kanye,7,Kim 
8,North,9,Kanye,9,Kanye 
11,Grace,10,James,10,James 

を出力を持っていますそのため、おそらく親を最初に取得し、その結果を基にするためにサブクエリまたはおそらくは組合が必要であると考えている理由です。私は次のものを出力しようとしています。

3,Brooklyn,1,David,2,Victoria 
6,Suri,4,Tom,5,Katie 
8,North,9,Kanye,7,Kim 
11,Grace,10,James,, <-should display no mother details (same for the father if father was not in the data) 
+0

は、SQL Serverを使用していますか? –

答えて

0

申し訳ありません。質問を今すぐチェックすることはできません。これは機能しますか?

SELECT DISTINCT p.ID, p.name, f.ID, f.name, m.ID, m.name 
FROM people AS p 
LEFT JOIN relationship AS fr 
     ON p.ID = fr.peopleID 
     AND fr.relationship IN ('Father','Stepfather') 
LEFT JOIN people AS f 
     ON fr.relatedID = f.ID 
LEFT JOIN relationship AS mr 
     ON p.ID = mr.peopleID 
     AND mr.relationship IN('Mother','Stepmother') 
LEFT JOIN people AS m 
     ON mr.relatedID = m.ID 
WHERE p.ID IN(3,6,8,11) 

点は、使用を取り除くことである(ここで、A OR B)を一緒にLEFT JOINと。結果の論理にあまりにも不確実性をもたらします

+0

これは最初のテストからうまくいくようですが、結合自体にINフィルタを使用することはできませんでした。常にINはWHERE節に入れなければならないと考えました。 – JK36

+0

IN( 'B'、 'C​​')は、(A = 'B' OR A = 'C')との違いはありません。左結合は常にあなたに何かをもたらします - それはNULLになるか、実際の値は結合フィルタに依存します。あなたが親を持たない人をフィルタリングしたい場合、WHERE(f.name IS NOT NULLまたはm.name IS NOT NULL)を使用する必要があります - この節が置き換え不可能な場合 – NLink

+0

select cast (p.id as nvarchar(max))+ '、' + p.name +(SELECT cast(p1.id as varchar(max))+ '、' + p1.name FROM関係r1内部結合people p1 on r1。 relatedID = p1.IDここでr1.peopleID = p.id(xmlパス( ''))の関係r内部の人pのp.ID = r.peopleIDのグループ(p.ID、p.name) – Sanjay

0

これはあなたが欲しいものですか?

SELECT p.ID, p.Name, p1.ID, p1.Name 
FROM relationship r 
    INNER JOIN people p ON p.ID = r.peopleID 
    INNER JOIN people p1 ON p1.ID = r.relatedID 

選択キャスト(データ型はnvarcharとしてp.id(最大))+ '' + p.name +(からキャスト(varchar型としてp1.id(最大))+ '' + p1.nameを選択関係r1内部結合の人p1 r1.relatedID = p1.ID r1.peopleID = p.id(xmlパス( ''))の関係r内部の人pのp.ID = r.peopleIDのグループp.ID 、p.name

もっと必要な場合はお知らせください。あなたはすでに答えを受け入れてきたにもかかわらず

+0

選択したキャスト.ID NVARCHARとして(MAX))+ '' + p.name +( \t SELECT CAST(p1.idとしてVARCHAR(MAX))+ '' 関係から+ p1.name \t \t \tが内側参加R1 r1.relatedID = p1.IDの人p1 \tここでr1.peopleID = p.id 01 XMLパスの\t( '') ) p.name、p.IDによってp.ID = r.peopleID グループに人Pを内部結合\t 関係Rから – Sanjay

0

が、私はまだ鉱山を提供したい:

WITH familly AS 
(
    SELECT 
     child.ID AS childID 
     ,child.Name AS childName 
     ,Relationship AS relationship 
     ,parent.ID AS parentID 
     ,parent.Name AS parentName 
    FROM relationship 
    LEFT JOIN people AS child ON child.ID = peopleID 
    LEFT JOIN people AS parent ON parent.ID = relatedID 
) 
SELECT 
    t.childID 
    ,t.childName 
    ,STUFF(ISNULL((
     SELECT ', ' + CAST(x.parentID AS NVARCHAR(10)) + ', ' + x.parentName 
     FROM familly x 
     WHERE x.childID = t.childID 
     GROUP BY x.parentID, x.parentName 
     FOR XML PATH (''), TYPE 
    ).value('.','VARCHAR(max)'), ''), 1, 2, '') [Parents] 
FROM familly t 
WHERE t.childID IN(3,6,8,11) 
GROUP BY t.childID, t.childName 

LEFT JOIN以下、より読みがあります。あなたはそう、テーブルrelationshipを使用してjointure を開始する必要があります:

  • 片側に、あなたは親としてpeople共同することができ、他の側にpeople
  • 子として参加することができます。

次に、よりわかりやすくするために、WITHというステートメントを使用しました。最後に、 操作STUFF (Transact-SQL)は、複数の文字列(親)を1つの行に連結します。

参考文献:

関連する問題