我有三张桌子:
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
列。如果库存是订购的,并且“无序”'如果股票无序。
答案 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
语句检查要返回的字符串。