+ -
当前位置:首页 → 问答吧 → 请教稠化查询~~~~

请教稠化查询~~~~

时间:2011-09-13

来源:互联网

参看了帖子:http://www.itpub.net/thread-1332059-1-1.html

[Copy to clipboard] [ - ]
CODE:
WITH t1 AS (
     SELECT 'a' tid, 'aa' tname FROM DUAL UNION ALL
     SELECT 'b' tid, 'bb' tname FROM DUAL UNION ALL
     SELECT 'c' tid, 'cc' tname FROM DUAL
),t2 AS (
     SELECT 'a' tid, 1 total FROM DUAL UNION ALL
     SELECT 'a' tid, 2 total FROM DUAL UNION ALL
     SELECT 'a' tid, 3 total FROM DUAL UNION ALL
     SELECT 'b' tid, 1 total FROM DUAL UNION ALL
     SELECT 'b' tid, 2 total FROM DUAL
)
SELECT t1.*,
       nvl(m.total,0) total
  FROM t1
  LEFT JOIN (
            SELECT t2.tid,
                    SUM(t2.total) total
               FROM t2
               WHERE 1=1
              GROUP BY t2.tid
              ) m PARTITION BY(m.tid) ON t1.tid = m.tid

TID TNAME      TOTAL
--- ----- ----------
a   aa             6
b   bb             3
c   cc             0

上面是我想要结果,问题:如果表m中没有检索出结果,要得到下面的结果,怎么写呢? 谢谢~~~

[Copy to clipboard] [ - ]
CODE:
TID TNAME      TOTAL
--- ----- ----------
a   aa             0
b   bb             0
c   cc             0

作者: hudingchen   发布时间: 2011-09-13

没有看明白,到底是什么意思?

作者: bell6248   发布时间: 2011-09-13



QUOTE:原帖由 bell6248 于 2011-9-13 17:05 发表
没有看明白,到底是什么意思?

WITH t1 AS (
     SELECT 'a' tid, 'aa' tname FROM DUAL UNION ALL
     SELECT 'b' tid, 'bb' tname FROM DUAL UNION ALL
     SELECT 'c' tid, 'cc' tname FROM DUAL
),t2 AS (
     SELECT 'a' tid, 1 total FROM DUAL UNION ALL
     SELECT 'a' tid, 2 total FROM DUAL UNION ALL
     SELECT 'a' tid, 3 total FROM DUAL UNION ALL
     SELECT 'b' tid, 1 total FROM DUAL UNION ALL
     SELECT 'b' tid, 2 total FROM DUAL
)
SELECT t1.*,
       nvl(m.total,0) total
  FROM t1
  LEFT JOIN (
            SELECT t2.tid,
                    SUM(t2.total) total
               FROM t2
               WHERE 1=2
              GROUP BY t2.tid
              ) m PARTITION BY(m.tid) ON t1.tid = m.tid

上面的m中是没有数据的,如果用LEFT JOIN PARTITION BY的写法,会检索不出数据,想得到下面的结果

[Copy to clipboard] [ - ]
CODE:
TID TNAME      TOTAL
--- ----- ----------
a   aa             0
b   bb             0
c   cc             0

[ 本帖最后由 hudingchen 于 2011-9-13 17:14 编辑 ]

作者: hudingchen   发布时间: 2011-09-13



QUOTE:原帖由 hudingchen 于 2011-9-13 17:11 发表



WITH t1 AS (
     SELECT 'a' tid, 'aa' tname FROM DUAL UNION ALL
     SELECT 'b' tid, 'bb' tname FROM DUAL UNION ALL
     SELECT 'c' tid, 'cc' tname FROM DUAL
),t2 AS (
     SELECT 'a' tid, 1 total FROM DUAL UNION ALL
     SELECT 'a' tid, 2 total FROM DUAL UNION ALL
     SELECT 'a' tid, 3 total FROM DUAL UNION ALL
     SELECT 'b' tid, 1 total FROM DUAL UNION ALL
     SELECT 'b' tid, 2 total FROM DUAL
)
SELECT t1.*,
       nvl(m.total,0) total
  FROM t1
  LEFT JOIN (
            SELECT t2.tid,
                    SUM(t2.total) total
               FROM t2
               WHERE 1=2
              GROUP BY t2.tid
              ) m PARTITION BY(m.tid) ON t1.tid = m.tid

上面的m中是没有数据的,如果用LEFT JOIN PARTITION BY的写法,会检索不出数据,想得到下面的结果

TID TNAME      TOTAL
--- ----- ----------
a   aa             0
b   bb             0
c   cc             0



为什么一定要用LEFT JOIN PARTITION BY的写法呢, 你的代码改改不就可以了, 使用LEFT JOIN PARTITION BY只是10g开始提供一种方便的写法而已, 没有什么特别的!

SQL> WITH t1 AS (
  2       SELECT 'a' tid, 'aa' tname FROM DUAL UNION ALL
  3       SELECT 'b' tid, 'bb' tname FROM DUAL UNION ALL
  4       SELECT 'c' tid, 'cc' tname FROM DUAL
  5  ),t2 AS (
  6       SELECT 'a' tid, 1 total FROM DUAL UNION ALL
  7       SELECT 'a' tid, 2 total FROM DUAL UNION ALL
  8       SELECT 'a' tid, 3 total FROM DUAL UNION ALL
  9       SELECT 'b' tid, 1 total FROM DUAL UNION ALL
10       SELECT 'b' tid, 2 total FROM DUAL
11  )
12  SELECT t1.*,
13         nvl(m.total,0) total
14    FROM t1
15    LEFT JOIN (
16              SELECT t2.tid,
17                      SUM(t2.total) total
18                 FROM t2
19                 WHERE 1=2
20                GROUP BY t2.tid
21                ) m  ON t1.tid = m.tid
22  /

TID TNAME      TOTAL
--- ----- ----------
b   bb             0
c   cc             0
a   aa             0

SQL>


作者: bell6248   发布时间: 2011-09-13