2016-05-16 12 views
0

に、2つのテーブル/組合に参加:SQLは、次の構造とデータ設けられた複数の条件

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 | 
---------------------------- 

I CHANGESのレコードを取得する必要があります。そのレコードは、に存在しません、または存在する場合は、より後にLAST_UPD_DATEのレコードを取得します。 は、したがって、上記の例では、私は別の合流しようとしている123と124

を取得する必要がありますが、私は私が望む結果を得るように見えることはできません。 INNER JOINは、交差点のために使用され、LEFT JOINは、最初のテーブルのすべてを取得し、あなたが設定した条件に一致する2番目のテーブルのものだけです - これらのどれも私が望むものではありません。だから、ソリューションは何らかの種類のUNIONですか?

答えて

3

このお試しください:これはEXPORT_LOGテーブルプラス後でLAST_EXPORTよりLAST_UPD_DATEを持ってCHANGESテーブルのレコードに一致していないCHANGESテーブルのすべてのレコードを返します

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) 

を。

+0

仕事をしている、ありがとうございます。しかし、これはどういうものなのか説明できますか? 'ON t1.ID = t2.ID'の結果の後に' where'節が適用されていませんか? 'WHERE'がなければ、' t2.ID'が 'ヌル 'であるレコードはありません – mavili

+1

@mavili - はい、あります。これはまさしく外部結合(この場合は左結合)が行うことです - あなたが話しているレコードを作成します。ここでt1.idには対応するt2.idがありません。 (これは、 "t2.idがヌルである"という意味ではないことに注意してください)。 – mathguy

0

一つの方法は、直接existsを使用して条件を翻訳することです:

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

。それはあなたの要件ごとに動作する必要があります。

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));

+1

Giorgiosはすでにこのソリューションを投稿しました.1つの違いがあります。この問合せでは、外部結合用に廃止されたOracle独自の構文を使用する理由はありません。デメリットは両方の理由がありますが、特に最初のデメリットです。 – mathguy

関連する問題