我将试着用一个例子来解释。
我有两张table:
table1
column1 column2 column3
000001 ABC COD1
000001 ABC COD2
000002 BCD COD3
000003 EDF COD1
000003 EDF COD3
000004 FGH COD1
000004 FGH COD2
000004 FGH COD3
000004 FGH COD4
table2
column3
COD1
COD2
COD3
COD4
COD5
COD6
COD7
表2只包含表1的第3列的所有可能的代码(仅此)。表1包含了我的真实数据。我不想要表2,代码5,代码6和代码7
我必须得到这样的结果
000001 ABC COD1
000001 ABC COD2
null null COD3
null null COD4
null null COD1
null null COD2
000002 BCD COD3
null null COD4
000003 EDF COD1
null null COD2
000003 EDF COD3
null null COD4
000004 FGH COD1
000004 FGH COD2
000004 FGH COD3
000004 FGH COD4
我需要用oraclesql来实现这一点,但我不确定这是否可行。如果需要,我可以接受第一列始终是我当前的column1(即使column2为空)。我不想重复例如两个000004 fgh cod4,但我想重复如果null。
我尽我所能。。。但我所能做的最好的事情是在子查询上使用减号或右连接的并集,在子查询中我需要指定column1条件。
编辑这是一个朋友在我尝试时找到的正确答案
select * from
(select distinct a.col1, a.col2
from table1 a
right join (select col3 from table2 f
where f.col3 IN ('COD1','COD3','COD6')) b
on a.col3 = b.col3),
(select col3 from table2 f
where f.col3 IN ('COD1','COD3','COD6'));
4条答案
按热度按时间wwwo4jvm1#
下面的查询就可以了
bxpogfeg2#
你可以用
cross join
生成行,然后left join
:注:奇怪的是你有
NULL
前两列中的值。这样会产生完全重复的行。如果你使用select c1.col1, t1.col2, c3.col3
第一列中有有效值。swvgeqrz3#
你需要使用
cross join
以及left join
具体如下:wlwcrazw4#
您正在寻找一个分区外部连接一个“新”的功能从2004年,但仍然没有广泛使用。
我们的期望是
table1
包含的所有值column3
至少一个值,但column2
是稀疏的,必须填充(请注意,您甚至不需要table2
(全部)这个查询很简单,因为您希望column2为空,所以在添加它时,必须用
case
声明:这将按要求生成数据:
注意,manuall解决方案(即在分区外部联接之前)是从
table1
-请参见子查询comb
吼叫。第二步很简单
outer join
这个comb
去你的table这就得到了同样的结果。