Oracle11g Oracle Sql查询联接表

Oracle11g Oracle Sql查询联接表,oracle11g,oracle-sqldeveloper,plsqldeveloper,Oracle11g,Oracle Sqldeveloper,Plsqldeveloper,我需要输出如下所示 表格详情见附件 客户记录可以有一个(PRM或合法)地址类型详细信息,也可以有两个(合法和PRM)。 如果同时有两个查询,则应选择PRM详细信息 忽略同一客户的法律记录。 如果客户只有合法记录,则应选择该记录。有谁能帮我查询一下吗?我想这样做: WITH CustomerTable AS ( SELECT TO_NUMBER('234567') CID FROM DUAL UNION ALL SELECT TO_NUMBER ('235435') CID FROM DU

我需要输出如下所示

表格详情见附件

客户记录可以有一个(PRM或合法)地址类型详细信息,也可以有两个(合法和PRM)。 如果同时有两个查询,则应选择PRM详细信息 忽略同一客户的法律记录。

如果客户只有合法记录,则应选择该记录。有谁能帮我查询一下吗?我想这样做:

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,但我假设您会有其他字段

对于CustomerAddressTable中的每个客户ID C_CID,内联视图CustomerAddressSubset将只包含一种地址类型