如果没有行 return 具有来自其他表的连接条件值,则选择默认行
Selecting default row if no rows return with join condition values from other tables
我有两个 tables 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');
并且我想获得 table ORDERS 中所有订单的成本,因为默认费率 10 用于那些在 RATE table 中没有费率的订单对于相应的 id,如果一个 id 在 RATE table 中可用,但没有该 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,因为在 table。我尝试了以下方法但没有成功:
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": invalid identifier
- 00000 - "%s: invalid identifier"
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
;
有人可以帮忙查询吗?
您可以使用多个 outer joins
和 RATE
table 来获取所需的结果,如下所示:
SQL> SELECT
2 O.ID,
3 O.DOW,
4 O.COUNT * COALESCE(R.RATE, RD.RATE) AS COST
5 FROM
6 ORDERS O
7 LEFT JOIN RATE R ON ( O.DOW = R.DOW )
8 LEFT JOIN RATE RD ON ( R.ID IS NULL
9 AND RD.DOW = 0 )
10 ORDER BY O.ID;
ID DOW COST
---------- ---------- ----------
1 1 50
1 3 350
2 1 20
SQL>
干杯!!
我有两个 tables 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');
并且我想获得 table ORDERS 中所有订单的成本,因为默认费率 10 用于那些在 RATE table 中没有费率的订单对于相应的 id,如果一个 id 在 RATE table 中可用,但没有该 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,因为在 table。我尝试了以下方法但没有成功:
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": invalid identifier
- 00000 - "%s: invalid identifier"
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
;
有人可以帮忙查询吗?
您可以使用多个 outer joins
和 RATE
table 来获取所需的结果,如下所示:
SQL> SELECT 2 O.ID, 3 O.DOW, 4 O.COUNT * COALESCE(R.RATE, RD.RATE) AS COST 5 FROM 6 ORDERS O 7 LEFT JOIN RATE R ON ( O.DOW = R.DOW ) 8 LEFT JOIN RATE RD ON ( R.ID IS NULL 9 AND RD.DOW = 0 ) 10 ORDER BY O.ID; ID DOW COST ---------- ---------- ---------- 1 1 50 1 3 350 2 1 20 SQL>
干杯!!