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

卡雷利亚

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


希望以上内容对遇到此问题的其他人有所帮助。感谢所有答复。

安东尼

布莱恩·德米利亚(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

小提琴:http ://sqlfiddle.com/#!4/ddbe9/4/0

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在Oracle中联接表

在查询中连接 Oracle SQL Server 中的 2 个表时遇到问题

在Oracle中联接时态表

从表中获取状态,通过该状态在Oracle中联接

在Oracle SQL中联接具有常见列的表

我在oracle中创建数据库功能时遇到问题

在Oracle中使用GROUP BY遇到问题

ORACLE SQL 我在使用 select 语句时遇到问题,该语句应该显示每个分支的 MAX 余额

两个如何在Oracle SQL中联接两个表

我在从html表获取数据时遇到问题

如何在Oracle中联接两个表

Oracle SQL从联接到另一个表时获取最大日期值

Oracle SQL中的字符串匹配和表联接

R 使用 RSQLite 和 dbplyr 从 DBI 包中的函数查找 sql 数据库中的表时遇到问题

使用联接SQL Oracle更新表

Oracle SQL添加左联接相同的表

在Oracle / SQL的主查询中执行与表的联接时,如何使用内联视图获取top-n?

ORACLE SQL 联接 MULTI SELECT 语句 ORACLE

参数和Oracle SQL中的联接

Oracle SQL数据获取顺序

使用单个查询从两个不同的 mysql 表中获取数据时遇到问题..!

合并内部联接时遇到问题

在 Oracle 中创建表时获取无效数据类型

Oracle - 从具有特定列和值的所有表中获取数据的 SQL

使用 python 和 selenium 从表中抓取数据时遇到问题

oracle 表单获取表和多行块中的数据

从 express 中连接的 sql 表访问数据时遇到问题

使用 PHP 获取 JSON 数据时遇到问题

我在获取数据时加入时遇到问题