gpt4 book ai didi

sql - 在 Oracle SQL 中连接表和获取数据时出现问题

转载 作者:行者123 更新时间:2023-12-02 05:31:53 25 4
gpt4 key购买 nike

我正在使用 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



我需要什么
我需要的是一个查询,显示 table_1 上的所有 SKU(每行一个 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



我尝试过的
我首先运行了一个查询,以确保我能够从 table_1 中提取所需的所有 SKU。

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(+)


但在这一点上,我认为我只是在捕获救命稻草,而且我自己被太多我不知道的东西淹没了。

我的问题是什么
A) 我无法弄清楚如何让 MAIN_LOC_QTY 列根据 Table 2 数据显示数量。

B)当表 1 中的 SKU 存在于表 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

fiddle :http://sqlfiddle.com/#!4/ddbe9/4/0

关于sql - 在 Oracle SQL 中连接表和获取数据时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25089022/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com