Oracle SQL中的动态列选择

时间:2017-12-21 02:37:23

标签: sql oracle

我有三张桌子:

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列。如果库存是订购的,并且“无序”'如果股票无序。

1 个答案:

答案 0 :(得分: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_id具有与之关联的订单。它还使用GROUP BY确保每个stock_id只返回一行,无论找到多少订单。

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

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