如果没有行返回其他表的连接条件值,则选择默认行

问题描述 投票:0回答:1

我有两个表ORDERSRATE

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中所有订单的成本,因为对于那些没有ID的RATE表中没有费率的订单,使用默认费率10在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”:无效的标识符

  1. 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
;

有人可以帮助查询吗?

sql oracle join conditional-statements default-value
1个回答
0
投票

您可以将多个outer joinsRATE表一起使用以获取所需的结果,如下所示:

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>

干杯!

© www.soinside.com 2019 - 2024. All rights reserved.