【问题标题】:Joining 2 tables for value comparision连接 2 个表进行值比较
【发布时间】:2020-05-29 21:37:20
【问题描述】:

我有 2 个表格,其中包含如下数据:

Table1-
Col1.  Col2
A1.     B1
A1.     B2

Table2-
Col1.  Col2
A1.     C1
A1.     C2

现在,当我加入这 2 个表来比较 col2 时,有时我会得到像 A1-B1-C1;A1-B2-C2 这样的输出,有时我会得到像 A1-B1-C2;A1-B2-C1 这样的输出。 但我不希望它以第二种形式出现。任何人都可以提出任何有助于我实现这一目标的查询。 提前致谢

【问题讨论】:

  • 你是如何加入他们的? “比较col2”是什么意思?什么?您介意发布您的查询吗?

标签: oracle join


【解决方案1】:

你可以用ROW_NUMBER()窗口函数来做到这一点:

select t1.col1, t1.col2, t2.col2
from (
  select t.*, row_number() over (partition by col1 order by col2) rn 
  from table1 t
) t1 inner join  (
  select t.*, row_number() over (partition by col1 order by col2) rn 
  from table2 t
) t2 on t2.col1 = t1.col1 and t2.rn = t1.rn 

请参阅demo。
结果:

> COL1 | COL2 | COL2
> :--- | :--- | :---
> A1   | B1   | C1  
> A1   | B2   | C2  

【讨论】:

    【解决方案2】:

    最明显的 join 位于 col1 列上,它返回 4 行:

    SQL> with
      2  t1 (col1, col2) as
      3    (select 'A1', 'B1' from dual union all
      4     select 'A1', 'B2' from dual
      5    ),
      6  t2 (col1, col2) as
      7    (select 'A1', 'C1' from dual union all
      8     select 'A1', 'C2' from dual
      9    )
     10  select a.col1, a.col2 a_col2, b.col2 b_col2
     11  from t1 a join t2 b on a.col1 = b.col1
     12  order by a.col1, a.col2, b.col2;
    
    COL1    A_COL2  B_COL2
    ------- ------- -------
    A1      B1      C1
    A1      B1      C2
    A1      B2      C1
    A1      B2      C2
    
    SQL>
    

    这些是您命名的所有组合,那么 - 您如何“有时”只得到其中两个,而“有时”又得到两个? 另外两个结果有什么问题(正如您所说,您根本不希望它们显示)?

    【讨论】:

      【解决方案3】:

      另一种选择是使用RANK windows 函数,如下所示:

      SELECT T1C1, T1C2, T2C2 FROM 
      (SELECT T1.COL1 T1C1, T1.COL2 T1C2, T2.COL1 T2C1, T2.COL2 T2C2, 
             RANK() OVER (PARTITION BY T1.COL1 ORDER BY T1.COL2) AS T1RN,  
             RANK() OVER (PARTITION BY T1.COL1 ORDER BY T2.COL2) AS T2RN
      FROM TABLE1 T1 JOIN TABLE2 T2 ON T1.COL1 = T2.COL1)
      WHERE T1RN = T2RN;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-02-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多