【发布时间】:2020-04-12 15:49:31
【问题描述】:
我有两张桌子ORDERS 和RATE:
CREATE TABLE ORDERS
( ID NUMBER(12,0),
DOW NUMBER(12,0),
COUNT NUMBER(12,0)
);
CREATE TABLE RATE
( ID NUMBER(12,0),
DOW NUMBER(12,0),
RATE NUMBER(12,0)
);
INSERT INTO ORDERS (ID, DOW, COUNT) VALUES ('1', '1', '5');
INSERT INTO ORDERS (ID, DOW, COUNT) VALUES ('1', '3', '7');
INSERT INTO ORDERS (ID, DOW, COUNT) VALUES ('2', '1', '2');
INSERT INTO RATE (ID, DOW, RATE) VALUES ('1', '1', '10');
INSERT INTO RATE (ID, DOW, RATE) VALUES ('1', '2', '20');
INSERT INTO RATE (ID, DOW, RATE) VALUES ('1', '0', '50');
并且我想获取表 ORDERS 中所有订单的成本,假设默认费率为 10 用于那些在 RATE 表中没有相应 ID 费率的订单,并且如果 ID 为RATE 表中可用,但该 id 的某个 dow 没有可用的汇率,则该 id 始终可以使用 dow 0 的默认汇率。
对于上面的示例,预期如下:
id dow cost
--------------
1 1 50
1 3 350
2 1 20
请注意,id=1 和 dow=3 的 350 来自计数 7 乘以 id=1 和 dow=0 的比率 50,因为表中没有 id=1 和 dow=3 的比率。我试过以下没有运气:
SELECT o.id, o.dow, o.count*(coalesce(r.rate, 10)) as cost
FROM orders o
left join rate r
on r.id = o.id
and r.dow = o.dow
;
以下有编译错误:
ORA-00904: "O"."DOW": 标识符无效
- 00000 - “%s:无效标识符”
SELECT o.id ,o.dow ,o.count * (coalesce(r.rate, 10)) cost
FROM orders o
LEFT JOIN (
SELECT id, dow, rate
FROM rate
WHERE id = o.id
AND dow = o.dow
UNION ALL
SELECT id ,dow ,rate
FROM rate
WHERE id = o.id
AND dow = 0
AND NOT EXISTS (
SELECT 1
FROM rate
WHERE id = o.id
AND dow = o.dow
)
) r
ON r.id = o.id
;
有人可以帮忙查询吗?
【问题讨论】:
-
我认为 2 应该是 100?
-
在您发布的最后一个 SQL 查询中,尝试为
rate表分配一个别名。我猜 Oracle 解析器不够聪明,无法处理一个有别名的表和另一个没有别名的表。 -
@EdBangga,id 2 没有速率,因此使用默认速率,比如 10:2*10 = 20。
-
@Abra,给
rate表添加别名后不起作用。
标签: sql oracle join conditional-statements default-value