Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 从内部联接表中提取数据并将两行合并为一行_Sql_Oracle - Fatal编程技术网

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

Sql 从内部联接表中提取数据并将两行合并为一行,sql,oracle,Sql,Oracle,我想从查询中实现的是选择所有化身及其父亲和母亲(通过获取parentID和性别来确定),并使用化身用户名父亲用户名母亲用户名为每个化身显示1行 这是我一直在考虑的一种解决方案,它没有完成一个子查询,返回第一个父查询和另一个子查询,以便内部连接返回母查询 SELECT avatars.username as ChildUsername, father.username as FatherUsername, mother.username as MotherUsername FROM avatars

我想从查询中实现的是选择所有化身及其父亲和母亲(通过获取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);
数据:

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

   ChildUsername FatherUsername MotherUsername
   av3           av1            av2

我相信这将有助于选择母亲和父亲作为子查询

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

我相信这将有助于选择母亲和父亲作为子查询

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

你需要加入两次化身表——自我和父母

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;

你需要加入两次化身表——自我和父母

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;

使用条件聚合:

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

使用条件聚合:

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

子表有3列,插入子表有4个参数。您是否忘记了任何信息?您的children表有3列,插入children表有4个参数。您是否忘记了任何信息?啊,几分钟前您还有两个左连接,现在看来我复制了您的答案。@SqlZim-编辑时,我意识到其中一个是多余的。:-)@GurV干杯,还有一件事,我如何使用max(当p.gender='M'然后p.username结束时使用case)获得父亲头像,这样我就可以显示比用户名更多的属性,这样我就可以将父亲头像与其他表进行内部连接?@Higeath-您也可以对其他列使用类似的case。请查看更新后的答案。@GurV还有一件事关于父母的内部联接呢?几分钟前你有两个左联接,现在看起来我复制了你的答案。@SqlZim-编辑时我意识到其中一个是多余的。:-)@GurV干杯,还有一件事,我如何使用max(当p.gender='M'然后p.username结束时使用case)获得父亲头像,这样我就可以显示比用户名更多的属性,这样我就可以将父亲头像与其他表进行内部连接?@Higeath-您也可以对其他列使用类似的case。请查看更新的答案。@GurV还有一件事关于父母的内部连接呢?@GurV-Woohoo!ty@Gurv呜呼!泰