在Oracle SQL中连接表和获取数据时遇到问题

在Oracle SQL中连接表和获取数据时遇到问题,sql,oracle,select,case,outer-join,Sql,Oracle,Select,Case,Outer Join,我正在使用Oracle SQL Developer运行我的查询。 我在Oracle数据库中有两个表。见下文。 我需要什么 我需要的是一个查询,它显示表1上的所有SKU(每行一个SKU),并根据它们在表2中的位置将它们的数量列在列中。如果备份位置中没有提供数据,那么我只希望显示空值。下面提供了我需要的示例。 我尝试过的 我首先运行了一个查询,以确保能够从表1中调出所需的所有SKU SELECT table_1.sku AS SKU, table_1.ma

我正在使用Oracle SQL Developer运行我的查询。

我在Oracle数据库中有两个表。见下文。



我需要什么
我需要的是一个查询,它显示
表1
上的所有SKU(每行一个SKU),并根据它们在
表2
中的位置将它们的数量列在列中。如果备份位置中没有提供数据,那么我只希望显示空值。下面提供了我需要的示例。



我尝试过的
我首先运行了一个查询,以确保能够从
表1
中调出所需的所有SKU

SELECT   table_1.sku AS SKU,
         table_1.main_location AS MAIN_LOC

FROM     table_1

没问题。

然后,我将
表2
添加到查询中,甚至没有添加任何列,只是为了确保我得到的SKU行数与上一个查询相同,但这不起作用。见下文。

这是我开始有问题的时候;如果SKU存在于
表2
的两行中,那么它在我的查询中显示为两行,如下所示:

我需要上面的每个SKU只显示一行。

假设上述查询有效,我仍在尝试根据位置获取数量信息,如下所示:


join/outer join
(+)
是我获取所需所有SKU的唯一方法,但最终还是得到了相同SKU的重复行(这是我不想要的)。

我甚至尝试在
FROM
语句中进行子查询,以减少一些我不需要的SKU,如下所示:



这将产生与上一个查询几乎相同的结果。它去掉了一些我不需要的东西,但没有解决主要问题。

我还在where语句中添加了我所知甚少的连接/外部连接:

WHERE    table_1.sku(+) = table_2.sku
以及:

WHERE    table_1.sku = table_2.sku(+)

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

我的问题是什么
A) 我不知道如何让
MAIN\u LOC\u QTY
列显示基于
表2
数据的数量。

B) 当
表1
中的SKU存在于
表2
的两行上时,我的查询会为一个SKU生成两行,而我只需要存在一行,其中包含与该SKU相关的所有信息。

任何帮助都将不胜感激。谢谢


我的解决方案是什么(2014年8月2日更新)
对于任何遇到这个问题的人,我的解决方案是由下面的Brian Demilia提供的。基本上,我的问题如下:;


我希望以上内容能帮助其他遇到这个问题的人。感谢所有的回复

-安东尼

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:

我需要什么,我尝试了什么,我的问题是头球的加分。现在请注意……您使用的是非常旧的联接语法,虽然这可以工作,但使用ansi-92语法要容易得多。从表_1到表_2,其中表_1.sku=表_2.sku(+)等同于从表1到表_1.sku=表_2.sku的右连接talbe 2。我怀疑你想要这个的左连接版本。还在读问题;)或者读一下贾斯汀的回答,这正是我需要的。SQL FIDLE提供了极其丰富的信息。非常感谢。
  SKU  |  MAIN_LOC
--------------------
  111  |  09-DD
  111  |  09-DD
  222  |  02-BB
  333  |  07-CC
  444  |  06-HH
  444  |  06-HH
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(+)
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    table_1.sku(+) = table_2.sku
WHERE    table_1.sku = table_2.sku(+)
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