首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从内部联接表中提取数据并将两行合并为一列

从内部联接表中提取数据并将两行合并为一列
EN

Stack Overflow用户
提问于 2017-03-28 17:03:06
回答 3查看 35关注 0票数 0

我想要从查询中实现的是选择所有的化身及其父亲和母亲(通过获取parentID和性别来确定),并为每个化身显示1行头像用户名、父亲用户名、母亲用户名。

这是一种解决方案,我考虑的是没有完成返回第一个父亲的子查询和返回母亲的内部连接的另一个子查询。

代码语言:javascript
复制
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

数据库:

代码语言:javascript
复制
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);

数据:

代码语言:javascript
复制
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

对于上面的数据,我希望得到这个输出

代码语言:javascript
复制
   ChildUsername FatherUsername MotherUsername
   av3           av1            av2
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-03-28 17:14:44

你需要两次加入阿凡达的桌子-自我和父母。

代码语言:javascript
复制
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;
票数 2
EN

Stack Overflow用户

发布于 2017-03-28 17:16:02

使用条件聚合:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2017-03-28 17:11:53

我相信这将有效地选择父母作为子查询。

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43075658

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档