SQL:在多个条件下加入/联合两个表

时间:2016-05-16 11:58:35

标签: sql oracle join

提供以下结构和数据:

CREATE TABLE "CHANGES" (    
  "ID" NUMBER(38),
  "LAST_UPD_DATE" DATE DEFAULT SYSDATE
);

CREATE TABLE "EXPORT_LOG" (
  "ID" NUMBER(38),
  "LAST_EXPORT" DATE DEFAULT SYSDATE
);

CHANGES包含:

----------------------------
| ID  |  LAST_UPD_DATE     |
----------------------------
| 123 | 12-MAY-16 12.23.23 |
| 124 | 12-MAY-16 12.24.23 |
| 125 | 12-MAY-16 12.11.23 |
----------------------------

EXPORT_LOG

----------------------------
| ID  |  LAST_EXPORT       |
----------------------------
| 124 | 12-MAY-16 12.23.12 |
| 125 | 12-MAY-16 12.12.24 |
----------------------------

我需要获取CHANGESEXPORT_LOG中不存在的记录,或者如果存在,则获取LAST_UPD_DATE晚于LAST_EXPORT的记录。 所以在上面的例子中,我应该得到123和124。

我正在尝试不同的JOIN,但我似乎无法得到我想要的结果: INNER JOIN用于交叉点,LEFT JOIN获取第一个表的所有内容,但只有第二个表中与您设置的条件匹配的表 - 这些都不是我想要的。那么解决方案是某种UNION吗?

3 个答案:

答案 0 :(得分:3)

试试这个:

SELECT t1.*
FROM CHANGES AS t1
LEFT JOIN EXPORT_LOG AS t2 ON t1.ID = t2.ID 
WHERE (t2.ID IS NULL) OR (t1.LAST_UPD_DATE > t2.LAST_EXPORT)

这将返回CHANGES表中不存在EXPORT_LOG所有CHANGES表的记录的LAST_UPD_DATE表的所有记录LAST_EXPORT的{​​{1}}晚于{}

答案 1 :(得分:0)

一种方法是使用select c.* from changes c where not exists (select 1 from export_log el where c.id = el.id) or not exists (select 1 from export_log el where c.id = el.id and el.last_export > c.last_upd_date); 直接翻译条件:

select c.*
from changes c
where not exists (select 1 from export_log el where c.id = el.id and el.last_export > c.last_upd_date);

这可以简化为:

{{1}}

答案 2 :(得分:-1)

请使用下面提到的代码并向我提供反馈。它应该按照你的要求工作。



SELECT CH.ID, CH.LAST_UPD_DATE
FROM CHANGES CH, EXPORT_LOG EL 
WHERE CH.ID = EL.ID(+) 
AND ((EL.ID IS NULL) OR (CH.LAST_UPD_DATE > EL.LAST_EXPORT));