Oracle只有在第一个条件没有给出连接时才尝试第二个条件

时间:2018-01-31 10:20:40

标签: sql oracle join

我正在寻找一种方法来做一些像这样的事情,如果第一个条件没有匹配,做第二个。我们来举个例子。

我在查询中有这个JOIN:

SELECT A.COL1, A.COL2, B.COL1, B.COL2 
FROM A
FULL JOIN (SELECT COL1, COL2 FROM B)
ON B.COL1 = A.COL1
       OR B.COL2 = A.COL2

你看,有了这个OR条件,我可以为同一个B对象创建两个连接。我不希望这样。我想要的是:

  • 如果 B.COL1 = A.COL1
  • 没有结果
  • 然后让我们尝试使用 B.COL2 = A.COL2
  • 加入

2 个答案:

答案 0 :(得分:1)

如果B.COL1 = A.COL1则返回行。或者,如果B.COL1 <> A.COL1B.COL2 = A.COL2也返回行。

SELECT A.COL1, A.COL2, B.COL1, B.COL2 
FROM A
FULL JOIN (SELECT COL1, COL2 FROM B) B
   ON (B.COL1 = A.COL1)
   OR (B.COL1 <> A.COL1 and B.COL2 = A.COL2) 

答案 1 :(得分:1)

您需要在第二个过滤器中包含条件B.COL1 = A.COL1的否定。天真地,这是B.COL1 <> A.COL1,但这不会处理NULL值,因此您需要像这样使用B.COL1 <> A.COL1 OR B.COL1 IS NULL OR A.COL1 IS NULL

SELECT A.COL1, A.COL2, B.COL1, B.COL2 
FROM   A
       FULL JOIN (SELECT COL1, COL2 FROM B)
       ON (  B.COL1 = A.COL1
          OR ( ( B.COL1 <> A.COL1 OR B.COL1 IS NULL OR A.COL1 IS NULL )
               AND B.COL2 = A.COL2
             )
          )