如何将具有一对多关系的表组合成 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 行记录的主要内容,如果未能解决你的问题,请参考以下文章