2017-03-28 30 views
0

我想从查询中实现的是选择所有头像及其父母(通过获取parentID和性别来确定),并显示每个头像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列和你的INSERT INTO的孩子有4个参数。你是否在伪造任何信息? –

回答

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你几分钟前有两个左连接,现在它看起来像我复制你的答案。 – SqlZim

+0

@SqlZim - 编辑时我意识到一个是多余的。 :-) – 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

有我的赞赏:-) – GurV

+0

@Gurv Woohoo! TY – SqlZim