【发布时间】:2016-07-18 20:23:42
【问题描述】:
附件中提供了表格详细信息。
客户记录可以有一个(PRM 或 LEGAL)地址类型详细信息或两者(LEGAL 和 PRM)。
如果它有两个查询应该选择 PRM 详细信息
并忽略同一客户的法律记录。
如果客户只有 LEGAL only 记录,它应该选择它。谁能帮我查询一下
【问题讨论】:
标签: oracle11g oracle-sqldeveloper plsqldeveloper
附件中提供了表格详细信息。
客户记录可以有一个(PRM 或 LEGAL)地址类型详细信息或两者(LEGAL 和 PRM)。
如果它有两个查询应该选择 PRM 详细信息
并忽略同一客户的法律记录。
如果客户只有 LEGAL only 记录,它应该选择它。谁能帮我查询一下
【问题讨论】:
标签: oracle11g oracle-sqldeveloper plsqldeveloper
我会这样做:
WITH CustomerTable AS (
SELECT TO_NUMBER('234567') CID FROM DUAL
UNION ALL SELECT TO_NUMBER ('235435') CID FROM DUAL
),
CustomerAddressTable AS (
SELECT TO_NUMBER('234567') C_CID, 'PRM' Addr_Type, 'Line 10' Addr_1, TO_NUMBER('402') Addr_2 FROM DUAL
UNION ALL SELECT TO_NUMBER ('234567') C_CID, 'LEGAL' Addr_Type, 'Line 2' Addr_1, TO_NUMBER('302') Addr_2 FROM DUAL
UNION ALL SELECT TO_NUMBER ('235435') C_CID, 'LEGAL' Addr_Type, 'Line 1' Addr_1, TO_NUMBER('502') Addr_2 FROM DUAL
)
SELECT CustomerTable.CID, CustomerAddressSubset.Addr_1, CustomerAddressSubset.Addr_2 FROM
CustomerTable
LEFT JOIN
(
SELECT CustomerAddressTable.* FROM CustomerAddressTable
INNER JOIN (SELECT C_CID, Max(Addr_Type) Addr_Type FROM CustomerAddressTable GROUP BY C_CID) t
ON CustomerAddressTable.C_CID = t.C_CID AND CustomerAddressTable.Addr_type = t.Addr_type
) CustomerAddressSubset
ON CustomerTable.CID = CustomerAddressSubset.C_CID
使用 Max(AddrType) 选择 PRM 高于 LEGAL,因为 PRM 出现在字母表的后面。
第一个左连接允许您使用您在 CustomerTable 中碰巧拥有的任何其他字段:您的示例仅显示 CID,但我假设您还有其他字段。
内联视图 CustomerAddressSubset 将只包含 CustomerAddressTable 中每个客户 ID C_CID 的一种地址类型。
【讨论】: