【问题标题】:Conditional Join in Oracle SQLOracle SQL 中的条件连接
【发布时间】:2017-01-28 03:48:17
【问题描述】:

考虑以下 3 个表格。

表一

Col a   Col b   Col c
1   000 Actual data
1   001 Actual data
2   000 Actual data
3   000 Actual data
3   001 Actual data
3   002 Actual data

表 b

Col a   Col b   Col d
1   000 Actual data
1   001 Actual data
2   000 Actual data

Table c
Col a   Col b   Col d
3   000 Actual data
3   001 Actual data
3   002 Actual data

表 a 是父表,表 b 和 c 是子表,其中 col a 和 b 在 3 中通用,需要连接。

现在Join应该是这样的,如果在表b中没有找到数据,那么只应该在表c中搜索它

要求: 可乐 col b col c col d 1 000 一些数据更多数据 1 001 一些数据更多数据 2 000 一些数据更多数据 3 000 一些数据更多数据 3 001 一些数据更多数据 3 002 一些数据更多数据

好吧,目前我正在做的是,将 b 加入 a 并将 c 加入 a,但我认为每次在 a 中的记录都会在 b 和 c 中进行搜索,从而降低成本效益。因此希望使其具有成本效益/微调,以便如果 b 中不存在记录,则仅搜索 c。

【问题讨论】:

  • 编辑您的问题并提供示例数据和所需的结果。
  • 数据是机密的东西,但结构我有问题
  • @Somesh - 请也添加想要的结果
  • 绝对不是标准化的数据库设置,因为重复信息是一种浪费。此外,我建议将所有三个表联合起来,因为数据库引擎的优化器将处理所有不同行的最佳性能返回。
  • 添加了所需的数据。要求很简单,表a是你的基表/父表,在表b中搜索记录,如果在表b中没有找到则只在表c中搜索...

标签: sql database oracle join conditional


【解决方案1】:

您真正需要的是一种从表 B 中“收集”所有行的方法,如果没有,则从表 C 中“收集”所有行。然后连接到 A 是标准的。

这样的事情应该可以工作。将其设为子查询并加入您的第一个表。

select  col_a, col_b, col_c
  from  table_b
union all
select  col_a, col_b, col_c
  from  table_c
  where (select count(*) from table_b) = 0

如果table_b 至少有一行,则不会从table_c 中选择任何内容(因为where 条件对于table_c 中的所有行都是错误的)。但是,如果table_b 为空,则将选择table_c 中的所有行。

【讨论】:

    【解决方案2】:

    您需要做的是首先创建两个表 B 和 C 的并集,其中仅包含 B 和 C 中的那些记录,但如果它们在 B 中,那么我们应该忽略 C 的那些,然后与表 A 进行联接。因此:

    SELECT B.cola, B.colb from B
    UNION ALL
    SELECT C.cola, C.colb from C
    

    现在使用这个表,你可以像这样加入表 A:

    SELECT A.cola, A.colb, tmp.colc
    FROM A
    JOIN
    ( SELECT B.cola, B.colb, B.colc from B
    UNION ALL
    SELECT C.cola, C.colb from C) AS tmp
    ON A.cola = tmp.cola
    AND A.colb = tmp.colb
    

    【讨论】:

    • 一个 UNION ALL 做你正在做的事情,一个带有 INTERSECT 的 UNION,这是一个没有重复的独特 UNION。
    • 要求连接到表 C 中的行仅当表 B 为空时。这个(或您发布的第一个版本)是如何实现的?
    • @mathguy 这个问题并不意味着整个表 B 应该是空的。他的意思是,如果您在表 B 中找不到数据(特定行)的连接,那么您在 C 中搜索它
    • 哦...我明白了。你可能是对的;我的读法不同(也许字面意思)。
    【解决方案3】:

    两个左连接:

    select a.*, b.*, c.* 
    from a
    left join b
     on a.cola=b.cola
    and a.colb = b.colb
    left join c
     on a.cola=c.cola
    and a.colb=c.colb
    

    【讨论】:

    • 我猜它会检查 a 中的每个 c。
    • @SomeshPursnani 加入顺序将取决于。要找出答案,请获取执行计划
    猜你喜欢
    • 1970-01-01
    • 2017-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-16
    • 1970-01-01
    • 1970-01-01
    • 2022-07-19
    相关资源
    最近更新 更多