2012-04-18 105 views
1

数据:我写了两个查询,一个是WITH,另一个是SELECT,然后自己加入下表,但是两个查询都返回不同的结果,为什么会发生?WITH Query和SELECT Query有什么区别?

表名是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 

为什么?

+0

邮政一些示例数据.. – Teja 2012-04-18 19:48:05

+0

2 where子句是不同'fu.id_source_cur = 'A''与'fu.id_target_cur =' A'' – dotjoe 2012-04-18 19:59:26

回答

5

你的第二个查询是不同的,你有不同的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; 

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

3

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