sql - 困难连接 (SQL)

标签 sql oracle join

我有 2 个 sql 数据集:

数据集 1:

select * from (
       Select 1 rn, 'b' c, 3 Val from dual  UNION ALL
       Select 1 rn, 'r' c, 3 Val from dual  UNION ALL
       Select 1 rn, 'w' c, 3 Val from dual  UNION ALL
       Select 2 rn, 'b' c, 2 Val from dual  UNION ALL
       Select 2 rn, 'r' c, 2 Val from dual  UNION ALL
       Select 3 rn, 'b' c, 1 Val from dual  

) t1

数据集 2:

select * from ( 
       Select 'b' c from dual  UNION ALL
       Select 'r' c from dual  UNION ALL
       Select 'w' c from dual ) t2
   

我需要获取以下数据集:

rn  c   val
1   b   3 
1   r   3 
1   w   3 
2   b   2 
2   r   2 
2   w   null 
3   b   1 
3   r   null 
3   w   null

我尝试使用以下 sql 执行此操作,但它不起作用。

select t1.*, t2.*
FROM (
       Select 1 rn, 'b' c, 3 Val from dual  UNION ALL
       Select 1 rn, 'r' c, 3 Val from dual  UNION ALL
       Select 1 rn, 'w' c, 3 Val from dual  UNION ALL
       Select 2 rn, 'b' c, 2 Val from dual  UNION ALL
       Select 2 rn, 'r' c, 2 Val from dual  UNION ALL
       Select 3 rn, 'b' c, 1 Val from dual  

) t1 right join ( 
       Select 'b' c from dual  UNION ALL
       Select 'r' c from dual  UNION ALL
       Select 'w' c from dual ) t2 on   t1.c=t2.c 
       order by 1,2
   

请帮我解决我的问题。我使用 Oracle 数据库。

最佳答案

这是分区外连接的确切用例。对于大型数据集,它应该比 CROSS JOIN 方法更有效。

语法是这样的:

select t1.rn, 
       t2.c,
       t1.val
from   t1 partition by (rn) right join t2 on t2.c = t1.c;

PARTITION BY 关键字告诉 Oracle 为 t1.rn 的每个不同值重复外部连接。

这是一个完整的例子:

with t1 as (
     Select 1 rn, 'b' c, 3 Val from dual  UNION ALL
     Select 1 rn, 'r' c, 3 Val from dual  UNION ALL
     Select 1 rn, 'w' c, 3 Val from dual  UNION ALL
     Select 2 rn, 'b' c, 2 Val from dual  UNION ALL
     Select 2 rn, 'r' c, 2 Val from dual  UNION ALL
     Select 3 rn, 'b' c, 1 Val from dual
  ),
  t2 as (
     Select 'b' c from dual  UNION ALL
     Select 'r' c from dual  UNION ALL
     Select 'w' c from dual
  )
 select t1.rn, 
        t2.c,
        t1.val
 from   t1 partition by (rn) right join t2 on t2.c = t1.c;
+----+---+-----+
| RN | C | VAL |
+----+---+-----+
|  1 | b |   3 |
|  1 | r |   3 |
|  1 | w |   3 |
|  2 | b |   2 |
|  2 | r |   2 |
|  2 | w |   - |
|  3 | b |   1 |
|  3 | r |   - |
|  3 | w |   - |
+----+---+-----+

关于sql - 困难连接 (SQL),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70571771/

相关文章:

sql - Oracle PL/SQL 上年和上月

mysql - SQL : Outer Joins with one-to-many relationships

php - 'name' 中的未知列 'field list'

mysql - 升级到 Rails 4.2.0 : string literals in where conditions wrapped into quotation marks

sql - 如何在 PostgreSQL 中转置列和行(即如何切换行和列)?

sql - 常规结果和Count(*)在同一查询中

c++ - 简单查询需要几分钟才能在终止/非事件 session 上执行

Oracle 触发器效率与计划作业

sql - T-SQL 选择连接 3 个表

java - 使用注释的 Hibernate 一对多映射;我正在尝试使用外键关联将用户 ID 保存在另一个表中。