【问题标题】:Oracle Sql query joining tablesOracle Sql 查询连接表
【发布时间】:2016-07-18 20:23:42
【问题描述】:

我需要如下所示的输出

附件中提供了表格详细信息。

客户记录可以有一个(PRM 或 LEGAL)地址类型详细信息或两者(LEGAL 和 PRM)。 如果它有两个查询应该选择 PRM 详细信息 并忽略同一客户的法律记录。
如果客户只有 LEGAL only 记录,它应该选择它。谁能帮我查询一下

【问题讨论】:

    标签: oracle11g oracle-sqldeveloper plsqldeveloper


    【解决方案1】:

    我会这样做:

    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 的一种地址类型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-15
      • 2012-08-31
      相关资源
      最近更新 更多