提供以下结构和数据:
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 |
----------------------------
我需要获取CHANGES
中EXPORT_LOG
中不存在的记录,或者如果存在,则获取LAST_UPD_DATE
晚于LAST_EXPORT
的记录。
所以在上面的例子中,我应该得到123和124。
我正在尝试不同的JOIN,但我似乎无法得到我想要的结果:
INNER JOIN
用于交叉点,LEFT JOIN
获取第一个表的所有内容,但只有第二个表中与您设置的条件匹配的表 - 这些都不是我想要的。那么解决方案是某种UNION吗?
答案 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));