【问题标题】:What is the difference between WITH Query and SELECT Query?WITH查询和SELECT查询有什么区别?
【发布时间】:2026-01-06 18:40:01
【问题描述】:

数据:我写了两个查询,一个是 WITH,另一个是 SELECT,然后自加入下表,但是两个查询返回不同的结果,为什么会这样?

表名是 test_cur

    ID_SOURCE_CUR   ID_TARGET_CUR
 -------------  --------------
    A               B
    B               C
    C               D
    D               E
    A               Z
    G               A
    K               A
    Q               A
    J               J
    K               K
    K               L
    L               K
    B               A
    Z               A

那么为什么下面的两个查询返回不同的结果呢?

    SELECT *
      FROM test_cur tu, test_cur fu
     WHERE tu.id_target_cur = 'A'
       AND fu.id_source_cur = 'A'
       AND tu.id_source_cur <> fu.id_target_cur;

returns 8 rows.

ID_SOURCE_CUR   ID_TARGET_CUR   ID_SOURCE_CUR_1 ID_TARGET_CUR_1
--------------  --------------   --------------  -------------- 
    G               A               A               B
    K               A               A               B
    Q               A               A               B
    Z               A               A               B
    G               A               A               Z
    K               A               A               Z
    Q               A               A               Z
    B               A               A               Z 

还有-

    WITH qry1 AS
         (SELECT *
            FROM test_cur)
    SELECT *
      FROM qry1 tu, qry1 fu
     WHERE tu.id_target_cur = 'A'
       AND fu.id_target_cur = 'A'
       AND tu.id_source_cur <> fu.id_target_cur;

    returns 25 rows.

ID_SOURCE_CUR   ID_TARGET_CUR   ID_SOURCE_CUR_1 ID_TARGET_CUR_1
--------------  --------------   --------------  -------------- 
        G               A               G               A
        G               A               K               A
        G               A               Q               A
        G               A               B               A
        G               A               Z               A
        K               A               G               A
        K               A               K               A
        K               A               Q               A
        K               A               B               A
        K               A               Z               A
        Q               A               G               A
        Q               A               K               A
        Q               A               Q               A
        Q               A               B               A
        Q               A               Z               A
        B               A               G               A
        B               A               K               A
        B               A               Q               A
        B               A               B               A
        B               A               Z               A
        Z               A               G               A
        Z               A               K               A
        Z               A               Q               A
        Z               A               B               A
        Z               A               Z               A  

为什么?

【问题讨论】:

  • fu.id_source_cur = 'A'fu.id_target_cur = 'A' 的两个 where 子句不同

标签: sql oracle


【解决方案1】:

您的第二个查询不同,您有不同的WHERE 子句。第一个WHERE 是:

WHERE tu.id_target_cur = 'A'
       AND fu.id_source_cur = 'A'
       AND tu.id_source_cur <> fu.id_target_cur;

第二个是:

WHERE tu.id_target_cur = 'A'
       AND fu.id_target_cur = 'A' -- this line is different, it should be fu.id_source_cur = 'A'
       AND tu.id_source_cur <> fu.id_target_cur;

更改这些,两个查询的结果完全相同。

【讨论】:

    【解决方案2】:

    fu.id_source_cur = 'A'fu.id_target_cur = 'A' 的 where 子句不同

    【讨论】: