我有三张桌子:
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'。
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
s具有与之关联的订单。它还使用GROUP BY
来确保每个stock_id
只返回一行,无论找到多少订单。
LEFT JOIN
确保返回t_stock_details
中的每一行,无论它是否成功加入任何东西。在成功加入的地方,我们知道有订单。它也只会最多连接到一行(感谢上面提到的GROUP BY
,因此不会造成重复)。
不成功的连接将在NULL
中包含order_check.stock_id
,因此我们使用CASE
语句来检查要返回的字符串。