2011-11-28 15 views
0

相関サブクエリを使用しないようにこのクエリを書き直したいが、クエリから同じ出力を達成する。相関サブクエリを削除する方法

SELECT 
TABLE_1.REC_ID, 
TO_CHAR(table_1.REPORT_DATE, 'DD-MON-YY HH:MI:SS') report_date, 
(
    SELECT 
    MAX(table_3.NOTE_DATE) AS MAX_DATE 
    FROM 
    table_3 
    WHERE 
    table_3.REC_ID  = table_1.REC_ID 
    AND table_3.NOTE_DATE <= table_1.REPORT_DATE 
) 
notes_max_date 
FROM 
table_1 
ORDER BY 
To_date(table_1.REPORT_DATE, 'DD-MON-YY HH:MI:SS') 

そして、次のように出力は次のようになります。次のように

CREATE TABLE "TABLE_1" 
( "SITE_ID" NUMBER(*,0), 
"USER_ID" NUMBER(*,0), 
"REC_ID" NUMBER, 
"REPORT_DATE" DATE 
) ; 

CREATE TABLE "TABLE_2" 
( "SITE_ID" NUMBER, 
"NOTE_DATE" DATE, 
"NOTES" VARCHAR2(2000 BYTE), 
"USER_ID" NUMBER, 
"REC_ID" NUMBER 
) ; 

CREATE TABLE "TABLE_3" 
( "SITE_ID" NUMBER, 
"NOTE_DATE" DATE, 
"HELP_NOTES" VARCHAR2(2000 BYTE), 
"USER_ID" NUMBER, 
"REC_ID" NUMBER 
) ; 

REM INSERTING into TABLE_1 
Insert into TABLE_1 (SITE_ID,USER_ID,REC_ID,REPORT_DATE) values (1,6165,121,to_date('17-APR-10','DD-MON-RR')); 
Insert into TABLE_1 (SITE_ID,USER_ID,REC_ID,REPORT_DATE) values (1,6165,121,to_date('01-MAY-10','DD-MON-RR')); 
Insert into TABLE_1 (SITE_ID,USER_ID,REC_ID,REPORT_DATE) values (1,6165,121,to_date('08-MAY-10','DD-MON-RR')); 
Insert into TABLE_1 (SITE_ID,USER_ID,REC_ID,REPORT_DATE) values (1,6165,121,to_date('24-APR-10','DD-MON-RR')); 
Insert into TABLE_1 (SITE_ID,USER_ID,REC_ID,REPORT_DATE) values (1,6165,121,to_date('15-MAY-10','DD-MON-RR')); 
Insert into TABLE_1 (SITE_ID,USER_ID,REC_ID,REPORT_DATE) values (1,6165,121,to_date('05-JUN-10','DD-MON-RR')); 
Insert into TABLE_1 (SITE_ID,USER_ID,REC_ID,REPORT_DATE) values (1,6165,121,to_date('22-MAY-10','DD-MON-RR')); 
Insert into TABLE_1 (SITE_ID,USER_ID,REC_ID,REPORT_DATE) values (1,6165,121,to_date('29-MAY-10','DD-MON-RR')); 

REM INSERTING into TABLE_2 
Insert into TABLE_2 (SITE_ID,NOTE_DATE,NOTES,USER_ID,REC_ID) values (1,to_date('13-APR-10','DD-MON-RR'),'Notes - we need stuff.',6165,121); 

REM INSERTING into TABLE_3 
Insert into TABLE_3 (SITE_ID,NOTE_DATE,HELP_NOTES,USER_ID,REC_ID) values (1,to_date('17-MAY-10','DD-MON-RR'),'Entry #1',1932,121); 
Insert into TABLE_3 (SITE_ID,NOTE_DATE,HELP_NOTES,USER_ID,REC_ID) values (1,to_date('12-MAY-10','DD-MON-RR'),'Entry #2',6005,121); 
Insert into TABLE_3 (SITE_ID,NOTE_DATE,HELP_NOTES,USER_ID,REC_ID) values (1,to_date('25-MAY-10','DD-MON-RR'),'Entry #3',1932,121); 

ALTER TABLE "TABLE_1" MODIFY ("REC_ID" NOT NULL ENABLE); 
-------------------------------------------------------- 
-- Constraints for Table TABLE_2 
-------------------------------------------------------- 

    ALTER TABLE "TABLE_2" MODIFY ("SITE_ID" NOT NULL ENABLE); 

    ALTER TABLE "TABLE_2" MODIFY ("REC_ID" NOT NULL ENABLE); 
-------------------------------------------------------- 
-- Constraints for Table TABLE_3 
-------------------------------------------------------- 

    ALTER TABLE "TABLE_3" MODIFY ("SITE_ID" NOT NULL ENABLE); 

    ALTER TABLE "TABLE_3" MODIFY ("REC_ID" NOT NULL ENABLE); 

クエリがある

REC_ID     REPORT_DATE  NOTES_MAX_DATE    
---------------------- ------------------ ------------------------- 
121     17-APR-10 12:30:00       
121     24-APR-10 12:30:00       
121     01-MAY-10 12:30:00       
121     08-MAY-10 12:30:00       
121     15-MAY-10 12:30:00 12-MAY-10     
121     22-MAY-10 12:30:01 17-MAY-10     
121     29-MAY-10 12:30:01 25-MAY-10     
121     05-JUN-10 12:30:00 25-MAY-10     
8 rows selected 

出力は8行可能とNOTES_MAX_DATE colummでNULLを含める必要があります。ありがとう!

答えて

2

あなたはこのようなLEFT JOINGROUP BYでそれを書き換えることができます:

SELECT t1.REC_ID 
     ,to_char(t1.REPORT_DATE, 'DD-MON-YY HH:MI:SS') AS report_date 
     ,max(t3.NOTE_DATE) AS notes_max_date 
FROM table_1 AS t1 
LEFT JOIN table_3 AS t3 ON t3.REC_ID = t1.REC_ID 
         AND t3.NOTE_DATE <= t1.REPORT_DATE 
GROUP BY t1.REC_ID 
     ,to_char(t1.REPORT_DATE, 'DD-MON-YY HH:MI:SS') 
ORDER BY to_date(t1.REPORT_DATE, 'DD-MON-YY HH:MI:SS') 
+0

"notes_max_dateは" "MAX(NOTE_DATE)" 列の列の別名です。そうでなければ+1、私は左の外側の結合を逃していただろう。 –

+0

ああ、あなたはそれを修正しました。 –

+0

あなたは、新しいクエリが参加者として書かれた演奏者であると期待しますか?私はSQLで同じ問題を解決するためのさまざまなアプローチを見ているのが本当に楽しいです。いくつかの分析関数を使用することは可能ですか?そのアプローチの利点は何ですか?再度、感謝します。 – shawno

関連する問題