【问题标题】:Inner join to multiple columns and use in INSERT INSTO....SELECT多列的内连接并在 INSERT INTO....SELECT 中使用
【发布时间】:2018-05-11 08:04:35
【问题描述】:

CUST_DAY0_MERGE有以下列

NEW_CUST_ID
ACTIVE_REF_ID
OLD_REF_ID_1
OLD_REF_ID_2
OLD_REF_ID_3

我想在表CUST_REVIEWS 中创建一个插入语句,包含以下列:

CUST_REVIEW_ID
RUN_DATE
CUST_ID
CUST_SOURCE_UNIQUE_ID
CUST_SOURCE_REF_ID

此插入语句需要与CUST_DAY0_MERGE 进行内连接查询,条件如下:

CUST_DAY0_MERGE.OLD_REF_ID_1`=`CUST_REVIEWS.CUST_SOURCE_REF_ID
CUST_DAY0_MERGE.OLD_REF_ID_2`=`CUST_REVIEWS.CUST_SOURCE_REF_ID
CUST_DAY0_MERGE.OLD_REF_ID_3`=`CUST_REVIEWS.CUST_SOURCE_REF_ID

如果满足上述条件,将向CUST_REVIEWS 插入一条新记录,条件如下:

CUST_REVIEWS.CUST_ID`=`CUST_DAY0_MERGE.NEW_CUST_ID
CUST_REVIEWS.CUST_SOURCE_UNIQUE_ID`=`CUST_DAY0_MERGE.NEW_CUST_ID

对于其他列应根据现有值保持不变。

我有一个如下示例语句:

INSERT INTO CUST_REVIEWS(CUST_REVIEW_ID,RUN_DATE,CUST_ID,CUST_SOURCE_UNIQUE_ID,CUST_SOURCE_REF_ID)
SELECT CUST_REVIEW_ID,RUN_DATE,CUST_ID,CUST_SOURCE_UNIQUE_ID,CUST_SOURCE_REF_ID
FROM CUST_REVIEWS reviews
INNER JOIN CUST_DAY0_MERGE merge1
ON (reviews.CUST_SOURCE_REF_ID = merge1.OLD_REF_ID_1)
INNER JOIN CUST_DAY0_MERGE merge2
ON (reviews.CUST_SOURCE_REF_ID = merge2.OLD_REF_ID_2)
INNER JOIN CUST_DAY0_MERGE merge3
ON (reviews.CUST_SOURCE_REF_ID = merge3.OLD_REF_ID_3);

如何通过将CUST_IDCUST_SOURCE_UNIQUE_ID 更改为我想要达到的条件来增强插入语句?

【问题讨论】:

    标签: oracle inner-join multiple-columns


    【解决方案1】:

    “如果满足上述条件,将向 CUST_REVIEWS 插入一条新记录” - 你的意思是

    "如果以上至少一项" 或
    “如果以上所有”?

    在第二种情况下,您可以使用单个连接:

    INNER JOIN CUST_DAY0_MERGE merge
    ON (reviews.CUST_SOURCE_REF_ID = merge.OLD_REF_ID_1)
    AND
    (reviews.CUST_SOURCE_REF_ID = merge.OLD_REF_ID_2)
    AND
    (reviews.CUST_SOURCE_REF_ID = merge.OLD_REF_ID_3)
    

    在第一种情况下,您可以使用“OR”,但使用“UNION”会被报告为更理想:

    INNER JOIN CUST_DAY0_MERGE merge
        ON (reviews.CUST_SOURCE_REF_ID = merge.OLD_REF_ID_1)
        OR
        (reviews.CUST_SOURCE_REF_ID = merge.OLD_REF_ID_2)
        OR
        (reviews.CUST_SOURCE_REF_ID = merge.OLD_REF_ID_3)
    

    对比

           INSERT INTO CUST_REVIEWS(CUST_REVIEW_ID,RUN_DATE,CUST_ID,CUST_SOURCE_UNIQUE_ID,CUST_SOURCE_REF_ID)  
    
           SELECT CUST_REVIEW_ID,RUN_DATE,merge.NEW_CUST_ID as CUST_ID,merge.NEW_CUST_ID as CUST_SOURCE_UNIQUE_ID,CUST_SOURCE_REF_ID
    FROM CUST_REVIEWS reviews
           INNER JOIN CUST_DAY0_MERGE merge
               ON (reviews.CUST_SOURCE_REF_ID = merge.OLD_REF_ID_1)
    
           UNION
           SELECT CUST_REVIEW_ID,RUN_DATE,merge.NEW_CUST_ID as CUST_ID,merge.NEW_CUST_ID as CUST_SOURCE_UNIQUE_ID,CUST_SOURCE_REF_ID
    FROM CUST_REVIEWS reviews    
           INNER JOIN CUST_DAY0_MERGE merge
              ON (reviews.CUST_SOURCE_REF_ID = merge.OLD_REF_ID_2)
    
           UNION
           SELECT CUST_REVIEW_ID,RUN_DATE,merge.NEW_CUST_ID as CUST_ID,merge.NEW_CUST_ID as CUST_SOURCE_UNIQUE_ID,CUST_SOURCE_REF_ID
    FROM CUST_REVIEWS reviews    
           INNER JOIN CUST_DAY0_MERGE merge
              ON (reviews.CUST_SOURCE_REF_ID = merge.OLD_REF_ID_3)
    

    【讨论】:

    • 至少满足以上一项
    • 我了解使用单连接的部分。将带有条件的插入语句中的CUST_IDCUST_SOURCE_UNIQUE_ID 更改为CUST_DAY0_MERGE.NEW_CUST_ID 怎么样?
    • 您的选择语句真的正确吗?不应该是这样吗?:SELECT CUST_REVIEW_ID,RUN_DATE,MERGE.NEW_CUST_ID,MERGE.NEW_CUST_ID,CUST_SOURCE_REF_ID
    • 我测试了OR 的单连接,UNION 的内连接的语法怎么可能?我用 UNION 替换 OR 遇到语法错误
    • 我明白了,它需要 3 个查询语句,但与 OR 相比,性能要好得多?
    猜你喜欢
    • 2019-03-14
    • 1970-01-01
    • 2012-01-23
    • 1970-01-01
    • 2021-07-22
    • 2012-10-05
    • 2011-07-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多