【发布时间】:2021-12-24 01:01:23
【问题描述】:
我正在尝试通过将两个表连接到主列来从它们中获取数据。但是,如果右表中有第二列和第三列,则考虑它们并返回其对应的列。
LEFT_TAB
USER PRIMARY SECONDARY TERTIARY
1 A1 B1 (null)
2 X1 (null) (null)
RIGHT_TAB
PRIMARY SECONDARY TERTIARY INDICATOR
A1 B1 (null) I1
A1 (null) (null) I2
X1 (null) (null) I3
Expected Output:
USER PRIMARY SECONDARY TERTIARY INDICATOR
1 A1 B1 (null) I1
2 X1 (null) (null) I3
我已经在 PRIMARY 上尝试了 INNER JOIN,因为这是主列,而 SECONDARY 和 TERTIARY 是可选的。如果它们可用,那么我们使用它们和相应的行(LEFT OUTER JOIN),但它返回重复。
select lft.user_id,lft.primary,lft.secondary,lft.tertiary,rit.indication
from left_tab lft
INNER JOIN right_tab rit ON left.primary = rit.primary
LEFT JOIN right_tab rite ON
(left.secondary = rite.secondary OR left.tertiary = rite.tertiary) ---(join that's bringing dups)
;
OUTPUT:
USER PRIMARY SECONDARY TERTIARY INDICATOR
1 A1 B1 (null) I1
1 A1 B1 (null) I2 --duplicate
2 X1 (null) (null) I3
【问题讨论】:
-
我会避免
left作为表别名,因为left inner join看起来很奇怪。 (另外,似乎 Oracle 或多或少是单独没有保留它的,en.wikipedia.org/wiki/SQL_reserved_words.) -
另外你不能(或者至少不应该)为同一张表的不同实例使用相同的别名——你已经使用了两次“rit”
-
根据上述cmets更新。
-
当然,只要您在
RIGHT_TAB中有两行带有A1的行,它就会返回重复项。 Oracle 应该如何知道您的期望 或为什么您 认为某一行优于另一行?更有趣的案例是A1 null C1 I3和A1 B2 C2 I4中的额外行