Oracle SQL左连接并复制了空值

时间:2012-11-15 18:38:27

标签: sql oracle left-join

我不确定如何以Google会理解的方式提出这个问题。我想离开加入两个表并填写空白字段。这是我正在使用的内容:

tbl1
| user | date  | usage |
| us1  | 01/12 |  503  |
| us1  | 02/12 |  245  |
| us1  | 03/12 |  465  |
| us2  | 02/12 |  327  |
| us2  | 03/12 |  204  |
| us3  | 02/12 |  156  |

tbl2
| dates | avg_use |
| 01/12 |   345   |
| 02/12 |   426   |
| 03/12 |   502   |

Desired output
| user | date  | usage  |  pct_of_avg  |
| us1  | 01/12 |  503   |     1.45     |
| us1  | 02/12 |  245   |     .58      |
| us1  | 03/12 |  465   |     .93      |
| us2  | 01/12 | (null) |      0       |
| us2  | 02/12 |  327   |     .95      |
| us2  | 03/12 |  204   |     .41      |
| us3  | 01/12 | (null) |      0       |
| us3  | 02/12 |  156   |     .37      |
| us3  | 03/12 | (null) |      0       |

我非常了解JOIN,所以我知道典型的JOIN将无法执行此操作,因为tbl1.user中的数据将不存在。有没有办法在SQL中执行此操作?给予我正在尝试做名字的奖励积分,因为只知道谷歌如何帮助很多:)

2 个答案:

答案 0 :(得分:3)

这应该这样做:

SELECT U.user, T2.dates date, T1.usage, T1.usage/T2.avg_use pct_of_avg  
FROM (SELECT DISTINCT user FROM tbl1) U
CROSS JOIN tbl2 T2
LEFT JOIN tbl1 T1
    ON T2.date = T1.date  AND U.user = T1.user

答案 1 :(得分:2)

如果您的Oracle版本为10g或更高版本,则可以使用outer join SQL> select t.user1 2 , to_char(t1.dates, 'mm/yy') as date1 3 , t.usage1 4 , round((nvl(t.usage1, 0)/t1.avg_use), 2) as pct_of_avg 5 from tbl1 t 6 partition by(t.user1) 7 right join tbl2 t1 8 on (t.date1 = t1.dates) 9 ; USER1 DATE1 USAGE1 PCT_OF_AVG ----- ----- ---------- ---------- us1 01/12 503 1.46 us1 02/12 245 0.58 us1 03/12 465 0.93 us2 01/12 0 us2 02/12 327 0.77 us2 03/12 204 0.41 us3 01/12 0 us3 02/12 156 0.37 us3 03/12 0 9 rows selected 扩展名来填补数据空白。您将需要更少的代码。它会更简单,更快。

{{1}}