Oracle 进行一对一连接
Oracle making one to one join
我想从多对多进行一对多连接。两个表样本:
制作:
ORDER
PRODUCED_AMOUNT
PRODUCT_ID
Order1
1000
ProductID1
Order1
1000
ProductID1
Order1
5000
ProductID2
订单:
ORDER
AMOUNT_TO_PRODUCE
PRODUCT
PRODUCT_ID
Order1
600
Product1 - note1
ProductID1
Order1
600
Product1 - note2
ProductID1
Order1
600
Product1 - note3
ProductID1
Order1
5000
Product2
ProductID2
如果我写一个像这样的示例查询
SELECT ORDERS.ORDER, ORDER.AMOUNT_TO_PRODUCE, SUM(PRODUCTION.PRODUCED_AMOUNT), ORDERS.PRODUCT
FROM ORDERS JOIN PRODUCTION ON ORDERS.PRODUCT_ID = PRODUCTION.PRODUCT_ID
GROUP BY ORDERS.ORDER, ORDER.AMOUNT_TO_PRODUCE, ORDERS.PRODUCT
我明白了
ORDER
AMOUNT_TO_PRODUCE
PRODUCED_AMOUNT
PRODUCT
Order1
600
2000
Product1 - note1
Order1
600
2000
Product1 - note2
Order1
600
2000
Product1 - note3
Order1
5000
5000
Product2
但我想要
ORDER
AMOUNT_TO_PRODUCE
PRODUCED_AMOUNT
PRODUCT
Order1
600
2000
Product1 - note1
Order1
600
0
Product1 - note2
Order1
600
0
Product1 - note3
Order1
5000
5000
Product2
您似乎想要找到总生产量并将其加入订单 table 中每个订单和产品 ID 的第一行。如果是这样,您应该:
- 在加入之前对生产行求和
- 识别订单中的第一行 table 每个订单和产品 ID,您可以使用
row_number()
分析函数
- 将两者连接在一起,这将涉及将汇总的生产行与订单进行外部连接 table
你可以这样做:
WITH production AS (SELECT 'Order1' order_num, 1000 produced_amount, 'ProductID1' product_id FROM dual UNION ALL
SELECT 'Order1' order_num, 1000 produced_amount, 'ProductID1' product_id FROM dual UNION ALL
SELECT 'Order1' order_num, 5000 produced_amount, 'ProductID2' product_id FROM dual),
orders AS (SELECT 'Order1' order_num, 600 amount_to_produce, 'Product1 - note1' product, 'ProductID1' product_id FROM dual UNION ALL
SELECT 'Order1' order_num, 600 amount_to_produce, 'Product1 - note2' product, 'ProductID1' product_id FROM dual UNION ALL
SELECT 'Order1' order_num, 600 amount_to_produce, 'Product1 - note3' product, 'ProductID1' product_id FROM dual UNION ALL
SELECT 'Order1' order_num, 5000 amount_to_produce, 'Product2' product, 'ProductID2' product_id FROM dual),
-- end of mimicking your tables; main query below
prdctn_amts AS (SELECT order_num,
SUM(produced_amount) total_produced_amount,
product_id
FROM production
GROUP BY order_num,
product_id),
order_dets AS (SELECT order_num,
amount_to_produce,
product,
product_id,
row_number () OVER (PARTITION BY order_num, product_id ORDER BY product) rn
FROM orders)
SELECT o.order_num,
o.amount_to_produce,
NVL(p.total_produced_amount, 0)
total_produced_amount,
o.product
FROM order_dets o
LEFT OUTER JOIN prdctn_amts p ON o.order_num = p.order_num
AND o.product_id = p.product_id
AND o.rn = 1
ORDER BY o.order_num,
o.product_id,
o.rn;
产生以下输出:
ORDER_NUM AMOUNT_TO_PRODUCE TOTAL_PRODUCED_AMOUNT PRODUCT
--------- ----------------- --------------------- ----------------
Order1 600 2000 Product1 - note1
Order1 600 0 Product1 - note2
Order1 600 0 Product1 - note3
Order1 5000 5000 Product2
N.B。您不需要 with 子句中的前两个子查询;我添加了它们,这样我就可以模仿您的两个 table,而您只需直接引用这两个 table。此外,由于 ORDER
是 Oracle 中的保留字,我通过将列名更改为 ORDER_NUM
来避免每次需要引用它时都必须使用 "
来封装列名。
我想从多对多进行一对多连接。两个表样本:
制作:
ORDER | PRODUCED_AMOUNT | PRODUCT_ID |
---|---|---|
Order1 | 1000 | ProductID1 |
Order1 | 1000 | ProductID1 |
Order1 | 5000 | ProductID2 |
订单:
ORDER | AMOUNT_TO_PRODUCE | PRODUCT | PRODUCT_ID |
---|---|---|---|
Order1 | 600 | Product1 - note1 | ProductID1 |
Order1 | 600 | Product1 - note2 | ProductID1 |
Order1 | 600 | Product1 - note3 | ProductID1 |
Order1 | 5000 | Product2 | ProductID2 |
如果我写一个像这样的示例查询
SELECT ORDERS.ORDER, ORDER.AMOUNT_TO_PRODUCE, SUM(PRODUCTION.PRODUCED_AMOUNT), ORDERS.PRODUCT
FROM ORDERS JOIN PRODUCTION ON ORDERS.PRODUCT_ID = PRODUCTION.PRODUCT_ID
GROUP BY ORDERS.ORDER, ORDER.AMOUNT_TO_PRODUCE, ORDERS.PRODUCT
我明白了
ORDER | AMOUNT_TO_PRODUCE | PRODUCED_AMOUNT | PRODUCT |
---|---|---|---|
Order1 | 600 | 2000 | Product1 - note1 |
Order1 | 600 | 2000 | Product1 - note2 |
Order1 | 600 | 2000 | Product1 - note3 |
Order1 | 5000 | 5000 | Product2 |
但我想要
ORDER | AMOUNT_TO_PRODUCE | PRODUCED_AMOUNT | PRODUCT |
---|---|---|---|
Order1 | 600 | 2000 | Product1 - note1 |
Order1 | 600 | 0 | Product1 - note2 |
Order1 | 600 | 0 | Product1 - note3 |
Order1 | 5000 | 5000 | Product2 |
您似乎想要找到总生产量并将其加入订单 table 中每个订单和产品 ID 的第一行。如果是这样,您应该:
- 在加入之前对生产行求和
- 识别订单中的第一行 table 每个订单和产品 ID,您可以使用
row_number()
分析函数 - 将两者连接在一起,这将涉及将汇总的生产行与订单进行外部连接 table
你可以这样做:
WITH production AS (SELECT 'Order1' order_num, 1000 produced_amount, 'ProductID1' product_id FROM dual UNION ALL
SELECT 'Order1' order_num, 1000 produced_amount, 'ProductID1' product_id FROM dual UNION ALL
SELECT 'Order1' order_num, 5000 produced_amount, 'ProductID2' product_id FROM dual),
orders AS (SELECT 'Order1' order_num, 600 amount_to_produce, 'Product1 - note1' product, 'ProductID1' product_id FROM dual UNION ALL
SELECT 'Order1' order_num, 600 amount_to_produce, 'Product1 - note2' product, 'ProductID1' product_id FROM dual UNION ALL
SELECT 'Order1' order_num, 600 amount_to_produce, 'Product1 - note3' product, 'ProductID1' product_id FROM dual UNION ALL
SELECT 'Order1' order_num, 5000 amount_to_produce, 'Product2' product, 'ProductID2' product_id FROM dual),
-- end of mimicking your tables; main query below
prdctn_amts AS (SELECT order_num,
SUM(produced_amount) total_produced_amount,
product_id
FROM production
GROUP BY order_num,
product_id),
order_dets AS (SELECT order_num,
amount_to_produce,
product,
product_id,
row_number () OVER (PARTITION BY order_num, product_id ORDER BY product) rn
FROM orders)
SELECT o.order_num,
o.amount_to_produce,
NVL(p.total_produced_amount, 0)
total_produced_amount,
o.product
FROM order_dets o
LEFT OUTER JOIN prdctn_amts p ON o.order_num = p.order_num
AND o.product_id = p.product_id
AND o.rn = 1
ORDER BY o.order_num,
o.product_id,
o.rn;
产生以下输出:
ORDER_NUM AMOUNT_TO_PRODUCE TOTAL_PRODUCED_AMOUNT PRODUCT
--------- ----------------- --------------------- ----------------
Order1 600 2000 Product1 - note1
Order1 600 0 Product1 - note2
Order1 600 0 Product1 - note3
Order1 5000 5000 Product2
N.B。您不需要 with 子句中的前两个子查询;我添加了它们,这样我就可以模仿您的两个 table,而您只需直接引用这两个 table。此外,由于 ORDER
是 Oracle 中的保留字,我通过将列名更改为 ORDER_NUM
来避免每次需要引用它时都必须使用 "
来封装列名。