WITH Query和SELECT Query有什么区别?

Jam*_*ond 1 sql oracle

数据:我写了两个查询,一个是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
Run Code Online (Sandbox Code Playgroud)

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

    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 
Run Code Online (Sandbox Code Playgroud)

而且 -

    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  
Run Code Online (Sandbox Code Playgroud)

为什么?

Lam*_*mak 5

你的第二个查询是不同的,你有一个不同的WHERE条款.首先WHERE是:

WHERE tu.id_target_cur = 'A'
       AND fu.id_source_cur = 'A'
       AND tu.id_source_cur <> fu.id_target_cur;
Run Code Online (Sandbox Code Playgroud)

第二是:

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;
Run Code Online (Sandbox Code Playgroud)

更改这些并且两个查询的结果完全相同.