Oracle SQL中的动态列选择

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

我有三张桌子:

T_ORDER_PLACEMENTS (ORDER_ID, CUSTOMER_ID, ORDER_DATE)
T_ORDER_DETAILS (ORDER_ID, STOCK_ID)
T_STOCK_DETAILS(STOCK_ID, STOCK_NAME, STOCK_PRICE)

有人可以帮我写一个生成以下输出的查询:

STOCK_ID, STOCK_NAME, STOCK_PRICE, ORDERED_STATUS
1         stock1      5000         ordered
2         stock2      10000        unordered

如果库存是订购的话,用'ordered'填充ORDERED_STATUS列,如果库存是无序的,则填充'unordered'。

sql oracle
1个回答
1
投票
SELECT
    t_stock_details.*,
    CASE WHEN order_check.stock_id IS NULL THEN 'unordered' ELSE 'ordered' END  AS ordered_status
FROM
    t_stock_details
LEFT JOIN
(
    SELECT stock_id FROM t_order_details GROUP BY stock_id
)
    order_check
        ON order_check.stock_id = t_stock_details.stock_id

子查询检查哪个stock_ids具有与之关联的订单。它还使用GROUP BY来确保每个stock_id只返回一行,无论找到多少订单。

LEFT JOIN确保返回t_stock_details中的每一行,无论它是否成功加入任何东西。在成功加入的地方,我们知道有订单。它也只会最多连接到一行(感谢上面提到的GROUP BY,因此不会造成重复)。

不成功的连接将在NULL中包含order_check.stock_id,因此我们使用CASE语句来检查要返回的字符串。

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