2017-03-28 8 views
0

質問から達成したいのは、すべてのアバターとその父と母親を選択することです(親IDと性別を決定することによって)アバターusername内部結合テーブルからデータを引き出して2つの行を1つにマージする

これは私が最初に父と内側のための別のサブクエリを返すサブクエリを完了していないことを考えた解決策の一種であるが、母親に戻すために参加

SELECT avatars.username as ChildUsername, father.username as FatherUsername, mother.username as MotherUsername 
FROM avatars 
INNER JOIN avatars father(
    SELECT * 
    FROM children 
    INNER JOIN children child ON 
    WHERE avatars.gender = 'M' AND 
) 
INNER JOIN avatars mother 

データベース:

CREATE TABLE avatars 
    (avatarID NUMBER CONSTRAINT pk_avatars PRIMARY KEY, 
    username VARCHAR2(20), 
    gender CHAR(1) 
    ); 

CREATE TABLE children 
    (childID NUMBER CONSTRAINT pk_children PRIMARY KEY, 
    childAvatarID NUMBER, 
    parentAvatarID NUMBER 
    ); 

ALTER TABLE children 
ADD FOREIGN KEY (parentAvatarID) 
REFERENCES avatars(avatarID); 

ALTER TABLE children 
ADD FOREIGN KEY (childAvatarID) 
REFERENCES avatars(avatarID); 

データ:

INSERT INTO avatars VALUES (1,'av1','M'); 
INSERT INTO avatars VALUES (2,'av2','F'); 
INSERT INTO avatars VALUES (3,'av3','M'); 

INSERT INTO children VALUES (1,3,1); //Father 
INSERT INTO children VALUES (2,3,2); //Mother 

上記のデータはこの出力を得たいと考えています

ChildUsername FatherUsername MotherUsername 
    av3   av1   av2 
+0

あなたの子供たちのテーブルには、3つの列があり、子どもたちにあなたの挿入は、4つのパラメータがあります。あなたは情報を忘れていますか? –

答えて

2

アバターテーブルに自己と親の2回参加する必要があります。

select s.username as ChildUsername, 
    max(case when p.gender = 'M' then p.username end) as FatherUsername, 
    max(case when p.gender = 'F' then p.username end) as MotherUsername, 
    max(case when p.gender = 'M' then p.someothercolumn end) as FathersSomeOtherColumn, 
    max(case when p.gender = 'F' then p.someothercolumn end) as MothersSomeOtherColumn, 
    . . . 
from children c 
join avatars s on c.childAvatarID = s.avatarId 
left join avatars p on c.parentAvatarId = p.avatarId 
group by c.childAvatarID, 
    s.username; 
+0

awwあなたは数分前に2つの左結合をしていましたが、今はあなたの答えをコピーしたように見えます。 – SqlZim

+0

@SqlZim - 編集中、私は1つが冗長であることを認識しました。 :-) – GurV

+0

@GurV乾杯、私は最大の(p.gender = 'M'でp.usernameのときに)父親のアバターを得るためにどのようにしてユーザー名よりも多くの属性を表示できるのですか?他のテーブルと父親のアバターは、内部結合? – Higeath

0

これは、母親と父親をサブクエリーとして選択すると考えられます。

SELECT distinct a.username as ChildUsername, f.FatherUsername, m.MotherUsername 
FROM avatars a 
INNER JOIN (
    SELECT a.username as FatherUsername, c.childAvatarID 
    FROM avatars a 
    INNER JOIN children c 
    ON a.avatarID = c.parentAvatarID 
    WHERE a.gender = 'M' 
) f 
ON a.avatarID = f.childAvatarID 
INNER JOIN (
    SELECT a.username as MotherUsername, c.childAvatarID 
    FROM avatars a 
    INNER JOIN children c 
    ON a.avatarID = c.parentAvatarID 
    WHERE a.gender = 'F' 
) m 
ON a.avatarID = m.childAvatarID 
1

条件付き集約を使用:

select 
    av.username 
    , max(case when p.gender = 'M' then p.username end) as Father 
    , max(case when p.gender = 'F' then p.username end) as Mother 
from avatars av 
    inner join children c 
    on av.avatarid = c.childavatarid 
    left join avatars p 
    on p.avatarid = c.parentavatarid 
group by av.username 
+1

私のupvoteを持っています:-) – GurV

+0

@ Gurv Woohoo!タイ – SqlZim

関連する問題