这里是我要完成的任务的简要说明;我的查询如下。
我有两个表,一个表包含500个产品product_limit500
,另一个表具有订单order_limit1000
。
我的目标是创建一个表,其中包含每个订单的所有500种产品,所有产品的顺序相同(如order one followed by all other products
,然后是order two followed by the products in the same order
)。
这是我尝试使用的查询。
SELECT
r1.order_id,
r1.product_id,
r1.product_name,
CASE WHEN p1.product_id IN (SELECT
r2.product_id
FROM
order_limit1000 r2
WHERE
r2.order_id = r1.order_id) THEN 's'
ELSE '?'
END as 'torf'
FROM
order_limit1000 r1,
product_limit500 p1;
这是目前的结果。
order_id product_id product_name torf
5 13176 Bag of Organic Bananas ?
5 13176 Bag of Organic Bananas s
5 13176 Bag of Organic Bananas ?
5 13176 Bag of Organic Bananas ?
5 13176 Bag of Organic Bananas s
5 13176 Bag of Organic Bananas ?
5 13176 Bag of Organic Bananas ?
5 13176 Bag of Organic Bananas ?
5 13176 Bag of Organic Bananas ?
5 13176 Bag of Organic Bananas ?
5 13176 Bag of Organic Bananas s
5 13176 Bag of Organic Bananas ?
...
感谢您提供的任何帮助。
...
现在我正在使用一个包含500个products
和1000行orders
的视图,我仍在思考orders
的最终大小,大概是500k到1mi行。但是我使用的数据集大约有4.5mi行。
预期结果将类似于以下内容。
order_id product_id product_name torf
5 123 tomatoes s
5 124 limes ?
...
100 123 tomatoes ?
100 124 limes ?
答案 0 :(得分:1)
请不要在表名之间使用逗号,当然也不要用逗号代替cross join
。我不确定为什么要针对每个订单使用每种产品,但是要做到这一点,您确实需要完整的笛卡尔积,因此需要交叉连接。
SELECT
r1.order_id
, p1.product_id
, p1.product_name
, CASE
WHEN r1.product_id = p1.product_id THEN 's'
ELSE '?'
END AS 'torf'
FROM order_limit1000 r1
CROSS JOIN product_limit500 p1
ORDER BY
r1.order_id
, p1.product_id
, p1.product_name
鉴于订单表中已经有一个product_id,因此您不需要其他相关的子查询来测试是否应输出“ s”或“?”。 nb:我假设产品名称来自产品表,而不是订单表。
order_id R1.product_id P1.product_id product_name torf
---------- --------------- --------------- -------------- ------
5 123 123 tomatoes s << r1.product_id = p1.product_id
5 124 limes ?
...
100 123 tomatoes ?
100 124 limes ?