如何将具有一对多关系的表组合成 1 行记录

Posted

技术标签:

【中文标题】如何将具有一对多关系的表组合成 1 行记录【英文标题】:how to combine tables with 1 to many relationship into 1 line of record 【发布时间】:2015-01-01 04:33:37 【问题描述】:

我需要使用联合将两个具有一对多关系的表组合起来,但没有成功。

我一直在尝试使用此代码

select a.equipmentid,
a.codename,
a.name,
a.labelid,
a.ACQUISITIONDATE,
a.description
from TBL_EQUIPMENTMST a where
a.partofid = '57'
union all
select first 1 b.warrantyid, b.startdate, b.enddate from tbl_equipwarranty b
inner join TBL_EQUIPMENTMST c
on b.equipmentid=c.equipmentid
where c.partofid = '57' and b.servicetype='service' order by b.warrantyid desc
union all
select first 1 d.warrantyid, d.startdate, d.enddate from tbl_equipwarranty d
inner join TBL_EQUIPMENTMST e
on d.equipmentid=e.equipmentid
where e.partofid = '57' and d.servicetype='product' order by d.warrantyid desc

谁能帮助我如何在我的图像中产生我预期的输出。我正在使用 firebird 作为数据库。如果您在 mysql 中有解决方案,请告诉我,我会尝试在 firebird 中找到对应的。

【问题讨论】:

除了别名之外,您的第二个和第三个查询似乎相同? 对不起,关于相同的。我在我的代码中更正了它,但它仍然显示错误。 【参考方案1】:

秘诀是两次加入 tbl_equipwarranty - 使用 2 个不同的别名。一份服务保修,一份产品保修。您可以通过将服务类型指定为连接的一部分来执行此操作。以下使用 ANSI 连接,因此可能适用于 firebird 和 mysql:

SELECT
    a.equipmentid,
    a.codename,
    a.name,
    a.labelid,
    a.ACQUISITIONDATE,
    a.description,
    a.partofid,
    w1.warrantyid as serviceidwarranty, 
    w1.startdate, 
    w1.enddate,
    w2.warrantyid as productidwarranty, 
    w2.startdate, 
    w2.enddate
FROM TBL_EQUIPMENTMST a 
INNER JOIN tbl_equipwarranty w1 
    ON w1.equipmentid = a.equipmentid AND w1.servicetype = 'service'
INNER JOIN tbl_equipwarranty w2 
    ON w2.equipmentid = a.equipmentid AND w2.servicetype = 'Product'
WHERE
a.partofid = '57'

【讨论】:

你是救生员。有了这些知识,我现在可以轻松地使用 1 个 select 语句显示报告。我计划使用 3 select 并将其与 1 个记录集结合起来,并在我最后的手段的同时显示它。谢谢你的新知识^_^ @Mandz 很高兴能帮上忙 :-) 我还有一个问题。现在我需要将表与 1 到 N 关系组合,但现在我只需要 N 的最后一个值。你能帮我吗? ***.com/questions/26882396/…【参考方案2】:

只有当您为表中的设备 ID 提供唯一的保修 ID 时,这才会为您提供所需的结果。

SELECT 
a.equipmentid,
a.codename,
a.name,
a.labelid,
a.ACQUISITIONDATE,
a.description,
a.partofid,
B.warrantyid AS serviceidwarranty,
B.Startdate,
B.Enddate,
C.warrantyid AS productidwarranty,
C.Startdate,
C.Enddate

FROM TBL_EQUIPMENTMST A
LEFT OUTER JOIN tbl_equipwarranty B ON A.equipmentid=B.equipmentid AND B.Servicetype='Service'
LEFT OUTER JOIN tbl_equipwarranty C ON A.equipmentid=C.equipmentid AND C.Servicetype='Product'

【讨论】:

我试过你的代码先生,它也可以工作。抱歉,如果我之前已经选择了我的答案,因此无法选择您作为答案发布。不管怎么说,多谢拉。 ^_^

以上是关于如何将具有一对多关系的表组合成 1 行记录的主要内容,如果未能解决你的问题,请参考以下文章

具有一对多关系的表的规范化

在sqlalchemy中插入具有一对多关系的新记录

快速获取具有一对多关系的核心数据

在 ORM(Eloquent)中,具有 Genre 的 Book 是一对多关系吗?

使用具有一对多关系的 JPA 映射实体,如何添加连接条件

如何使用 Doctrine 选择没有具有特定值的一对多实体的所有行