【问题标题】:Complex Join in sqlsql中的复杂连接
【发布时间】:2014-07-25 13:16:45
【问题描述】:

我有以下场景

table1 - 有 1 条记录为 1001(主键)
table2 - 有 3 条具有相同 ID (1001) 的记录 - 不是主键
table3 - 具有相同 id (1001) 的 3 条记录 - 不作为主键

前 2 个表的连接返回 3 行(很好)。但是,如果我加入 table3,那么它会返回 9 行。我知道加入工作和预期结果如何。

我只需要 3 行的结果。如下图所示

 id      name     age     sex      city     
1001     Jhon      20      A        Z  
1001     Jhon      20      B        Y
1001     Jhon      20      C        X 

Here is fiddle example

【问题讨论】:

  • 请准备一个sqlfiddle 的例子,你会更快得到答案。
  • table2和table3是什么关系?您如何知道应该为 table2 的第一个值选择 table3 的三个值中的哪一个?如果你不这样做,那么 9 行是正确的数字。
  • 记录只是被复制了,不同的或分组的可以解决问题吗?样本数据将有助于获得预期的结果。
  • 为了得到这个,你必须对性别和城市做出决定。你用什么逻辑来判断 Z 市与性别 A 相关联?
  • 性别和城市是独立的。它们可以是任何组合。两者都依赖于 id 1001 而不是彼此。希望我清除了。

标签: sql oracle join


【解决方案1】:

This query 可以满足您的要求。要更改 Table2 和 Table3 之间的组合,您可以处理两个 ORDER BY 子句。反正真的很奇怪的要求!你确定你做对了吗?

with ord_t2 as (
    select idt1 as id, sex, row_number() over(partition by idt1 order by sex) as ord_no
    from table2 t2
  ), ord_t3 as (
    select idt3 as id, city, row_number() over(partition by idt3 order by city) as ord_no
    from table3 t3
  ), t2_x_t3 as (
    select id, sex, city
    from ord_t2
      natural full outer join ord_t3
  )
select *
from Table1
  natural left join t2_x_t3

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    相关资源
    最近更新 更多