如果 Join 中的值不可用,SQL Oracle 添加 'case when'

标签 sql oracle

我有下面两张表

enter image description here

enter image description here

~ 我想要做什么:我想将表 2 中的价格附加到表 1 中。如果表 1 中的确切数量不在表 2 中,则从表 2 中获取最接近的最大数量 [即12 表 2 中没有数量,最接近的最大值是 20,所以我想要它的价格]。

但在某些情况下,没有最大数量值,这会导致某些条目从我的输出中消失。在这种情况下,我考虑从表 2 中获取最接近的最小数量,以避免某些值超出我的输出

所以结果应该是这样的:

enter image description here

我已尝试以下查询,但这并不能说明当最接近的最大值不存在时采用最接近的最小数量。因此,Product_NR '20765' 不在我的输出中。我正在考虑“情况”,但不确定如何将其合并到下面。

select 
Product_NR,
Customer,
Quantity,
min(price)

from
   ( select distinct
    t1.Product_NR,
    t1.Customer,
    t1.Quantity,
    t2.price,
    min(t2.quantity) over (partition by t1.product_NR) as Quantity_min
    
    from Table_1 t1
    left join Table_2 t2 on t1.Product_NR = t2.Product_NR
                    and t1.Quantity <= t2.Quantity

   )
where t2.Quantity = Quantity_min

group by
Product_NR,
Customer,
Quantity

最佳答案

从 Oracle 12 开始,您可以使用 LATERAL 连接并对相关子查询进行排序,以在数量较少的行之前获取数量较多的行,然后仅获取第一行 :

SELECT *
FROM   table1 t1
       LEFT OUTER JOIN LATERAL(
         SELECT price
         FROM   table2 t2
         WHERE  t1.product_nr = t2.product_nr
         ORDER BY
                CASE WHEN t1.quantity <= t2.quantity THEN t2.quantity END
                  ASC NULLS LAST,
                t2.quantity DESC
         FETCH FIRST ROW ONLY
       )
       ON (1 = 1);

对于示例数据:

CREATE TABLE table1 (product_nr, customer, quantity) AS
SELECT 10023, 'X', 12 FROM DUAL UNION ALL
SELECT 10023, 'Y', 10 FROM DUAL UNION ALL
SELECT 10334, 'X',  1 FROM DUAL UNION ALL
SELECT 20765, 'Z',  5 FROM DUAL;

CREATE TABLE table2 (product_nr, quantity, price) AS
SELECT 10023,   1, 100 FROM DUAL UNION ALL
SELECT 10023,  10, 120 FROM DUAL UNION ALL
SELECT 10023,  20, 250 FROM DUAL UNION ALL
SELECT 10023, 100, 400 FROM DUAL UNION ALL
SELECT 10334,   0, 250 FROM DUAL UNION ALL
SELECT 10334, 200, 600 FROM DUAL UNION ALL
SELECT 20765,   1,  40 FROM DUAL UNION ALL
SELECT 20765,   2,  50 FROM DUAL;

输出:

PRODUCT_NR CUSTOMER QUANTITY PRICE
10023 X 12 250
10023 Y 10 120
10334 X 1 600
20765 Z 5 50

db<> fiddle here

关于如果 Join 中的值不可用,SQL Oracle 添加 'case when',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72517530/

相关文章:

sql - 存储库 - 在 native 查询中排序不起作用

javascript - 使用 oracle 查询创建图表

sql - 计算和显示跨多个字段的重复项

sql - 在 Oracle 中解析电子邮件地址以计算 @ 符号前具有 3 个或更少字符的地址数

c# - 如何在 TextBox Multiline 中选择行号

mysql - 即使在 MYSQL 表中互换时,如何使两行唯一?

c# - 将全文搜索与 SQL Server 合并有多难?

sql - 使用局部变量的 SELECT INTO 问题

mysql - 如何检查查询中的条件。

sql - PLSQL 从字符串中获取值