我正在使用Oracle SQL Developer运行查询。
我在Oracle数据库中有两个表。见下文。
table_1
------------------------------------------------------
SKU | MAIN_LOCATION | BACKUP_LOCATION
------------------------------------------------------
111 | 05-AA | 09-DD
222 | 02-BB | 10-JJ
333 | 07-CC | 13-LL
444 | 06-HH | 19-PP
table_2
---------------------------------------------
SKU | QUANTITY | LOCATION
---------------------------------------------
111 | 5 | 05-AA
111 | 8 | 09-DD
222 | 2 | 02-BB
333 | 4 | 07-CC
444 | 1 | 06-HH
444 | 11 | 19-PP
555 | 16 | 21-UU
什么,我需要
什么,我需要的是显示所有的SKU上的查询table_1
(每行一个SKU),以及它们的数量在列基础上,从他们的位置table_2
。如果备份位置中没有提供数据,那么我只想显示一个空值。下面提供了我需要的示例。
QUERY NEEDED
---------------------------------------------------------------------------
SKU | MAIN_LOC | MAIN_LOC_QTY | BACKUP_LOC | BACKUP_LOC_QTY
---------------------------------------------------------------------------
111 | 05-AA | 5 | 09-DD | 8
222 | 02-BB | 2 | 10-JJ | (null)
333 | 07-CC | 4 | 07-CC | (null)
444 | 06-HH | 1 | 19-PP | 11
我尝试过的东西
首先运行查询,以确保能够提取所需的所有SKU table_1
。
SELECT table_1.sku AS SKU,
table_1.main_location AS MAIN_LOC
FROM table_1
没问题。
然后table_2
,我将其添加到查询中,甚至没有添加任何列,只是为了确保我获得的SKU行数与我之前的查询相同,而这行不通。见下文。
SELECT table_1.sku AS SKU,
table_1.main_location AS MAIN_LOC
FROM table_1,
table_2
WHERE table_1.sku = table_2.sku(+)
这是我开始遇到问题的时候。如果SKU位于中的两行table_2
,则它在我的查询中以两行显示,如下所示:
SKU | MAIN_LOC
--------------------
111 | 09-DD
111 | 09-DD
222 | 02-BB
333 | 07-CC
444 | 06-HH
444 | 06-HH
我需要上面的内容仍然每个SKU仅显示一行。
假设上面的查询甚至可行,我仍在尝试根据位置获取数量信息,如下所示:
SELECT table_1.sku AS SKU,
table_1.main_location AS MAIN_LOC,
CASE
WHEN table_1.main_location = table_2.location THEN table2.quantity
ELSE NULL
END AS MAIN_LOC_QUANTITY,
table_1.backup_location AS BACKUP_LOC,
CASE
WHEN table_1.backup_location = table_2.location THEN table2.quantity
ELSE NULL
END AS BACKUP_LOC_QUANTITY
FROM table_1,
table_2
WHERE table_1.sku = table_2.sku(+)
联接/外部联接(+)
是我获得所需所有SKU的唯一方法,但最终仍会获得同一SKU的重复行(这是我不想要的)。
我什至尝试在FROM
语句中进行子查询以减少一些我不需要的SKU,例如:
SELECT table_1.sku AS SKU,
table_1.main_location AS MAIN_LOC,
CASE
WHEN table_1.main_location = sub_table.location THEN sub_table.quantity
ELSE NULL
END AS MAIN_LOC_QUANTITY,
table_1.backup_location AS BACKUP_LOC,
CASE
WHEN table_1.back_location = sub_table.location THEN sub_table.quantity
ELSE NULL
END AS BACKUP_LOC_QUANTITY
FROM table_1,
(
SELECT *
FROM table_2
WHERE location NOT LIKE '%[SOME CONDITIONS]%'
) sub_table
WHERE table_1.sku = table_2.sku
产生的结果与上一个查询几乎相同。它摆脱了一些我不需要的东西,但没有解决主要问题。
我还把我对联接/外部联接所知甚少的内容无奈地添加到了where语句中:
WHERE table_1.sku(+) = table_2.sku
也:
WHERE table_1.sku = table_2.sku(+)
但是在这一点上,我想我只是在吸管,而我自己却淹没了太多我所不知道的东西。
我的问题是什么?我
无法弄清楚如何使该MAIN_LOC_QTY
列基于Table 2
数据显示数量。
B)当的SKUTable 1
存在于的两行中时Table 2
,则我的查询为一个SKU生成两行,而当我只需要存在一行且包含与该SKU有关的所有信息时。
任何帮助将不胜感激。谢谢!
我的解决方案是什么(2014年8月2日更新)
对于遇到此问题的任何人,我的解决方案由下面的Brian Demilia提供。本质上,我的查询如下:
SELECT table_1.sku, --This is from table_1
table_1.main_location, --This is from table_1
main_loc.quantity, --This is from the 1st LEFT JOIN named main_loc
table_1.backup_location, --This is from table_1
backup_loc.quantity --This is from the 2nd LEFT JOIN named backup_loc
FROM table_1
/*LEFT JOIN below is to make table_2 with only the main_location from table_1*/
LEFT JOIN table_2 main_loc
ON table_1.main_location = main_loc.location
AND table_1.sku = main_loc.sku
/*LEFT JOIN below is to make table_2 with only the backup_location from table_1*/
LEFT JOIN table_2 backup_loc
ON table_1.backup_location = backup_loc.location
AND table1.sku = backup_loc.sku
希望以上内容对遇到此问题的其他人有所帮助。感谢所有答复。
安东尼
select t1.sku,
t1.main_location,
ml.quantity as main_qty,
t1.backup_location,
bl.quantity as bkup_qty
from table_1 t1
left join table_2 ml
on t1.sku = ml.sku
and t1.main_location = ml.location
left join table_2 bl
on t1.sku = ml.sku
and t1.backup_location = bl.location
order by t1.sku
小提琴:http ://sqlfiddle.com/#!4/ddbe9/4/0
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句