Sql 需要使用内部联接将值填充到行中

Sql 需要使用内部联接将值填充到行中,sql,oracle,Sql,Oracle,我在一个表中存储了联系人,在一个表中存储了他们的关系,在另一个表中存储了子详细信息。我需要使用每个家长的childid填充他们的“孩子名” CREATE TABLE contact_table( contactid NUMBER(3) ,contactname VARCHAR2(30) ,contactage NUMBER(2) ); CREATE TABLE contact_maritalstatus( statusid NUMBER(3) ,contactid NUMBER(3) ,

我在一个表中存储了联系人,在一个表中存储了他们的关系,在另一个表中存储了子详细信息。我需要使用每个家长的childid填充他们的“孩子名”

 CREATE TABLE contact_table(
 contactid NUMBER(3)
,contactname VARCHAR2(30)
,contactage NUMBER(2)
);


CREATE TABLE contact_maritalstatus(
statusid NUMBER(3)
,contactid NUMBER(3)
,contactgender VARCHAR2(8)
,contactstatus VARCHAR2(10)
);
CREATE TABLE contact_relation(
relationid NUMBER(3)
,contactid NUMBER(3)
,partnerid NUMBER(3)
,childid NUMBER(3)
);
CREATE TABLE contact_child(
childid NUMBER(3)
,contactid NUMBER(3)
);

SELECT cb.contactname,cm.contactgender,cm.contactstatus,cr.childid
FROM contact_table cb 
 inner join contact_maritalstatus cm  on cb.contactid = cm.contactid
 inner join contact_relation cr on cb.contactid = cr.contactid;

您尚未提供外键,因此我们必须推断您的数据模型。然而,父母和孩子似乎都在
联系表中
,而
联系关系
将配偶与配偶、父母与孩子联系在一起。如果是这样,您只需再次连接到
contact_table
,使用表和列别名来区分这两个实例:

SELECT cp.contactname as parent_name 
       , cm.contactgender
       , cm.contactstatus
       , cr.childid
       , cc.contactname as child_name 
FROM contact_table cp
 inner join contact_maritalstatus cm  on cp.contactid = cm.contactid
 inner join contact_relation cr on cb.contactid = cr.contactid
 inner join contact_table cc on cc.contactid = cr.childid 

您尚未提供外键,因此我们必须推断您的数据模型。然而,父母和孩子似乎都在
联系表中
,而
联系关系
将配偶与配偶、父母与孩子联系在一起。如果是这样,您只需再次连接到
contact_table
,使用表和列别名来区分这两个实例:

SELECT cp.contactname as parent_name 
       , cm.contactgender
       , cm.contactstatus
       , cr.childid
       , cc.contactname as child_name 
FROM contact_table cp
 inner join contact_maritalstatus cm  on cp.contactid = cm.contactid
 inner join contact_relation cr on cb.contactid = cr.contactid
 inner join contact_table cc on cc.contactid = cr.childid 

你认为你需要
contact\u maritalstatus
table..吗?不需要。我用它来显示每个人的婚姻状况。从建模的角度来看,性别是联系人的属性,而不是婚姻状况:孩子有性别,但(通常)没有婚姻状况。所以
contactgender
属于
contact\u表
。此外,使用一个表
contact\u relation
存储两种类型的关系也是混乱的。如果一对夫妇有一个以上的孩子,婚姻关系将被记录多次。除非您打算在
partnerid
childid
之间强制执行弧。一个更清晰的解决方案可能是将
的伴侣和
的父母作为两个单独的表格进行建模。你认为你需要
联系方式
表格吗?不。我用它来显示每个人的婚姻状况。从建模的角度来看,性别是联系的一个属性,而不是婚姻状况:孩子有性别,但是不是(通常)婚姻状况。所以
contactgender
属于
contact\u表
。此外,使用一个表
contact\u relation
存储两种类型的关系也是混乱的。如果一对夫妇有一个以上的孩子,婚姻关系将被记录多次。除非您打算在
partnerid
childid
之间强制执行弧。一个更清晰的解决方案是将
的is\u partner\u和
的is\u parent\u建模为两个单独的表。