2011-02-24 148 views
2

我有三個表:複雜SQL查詢加入

  • 第一個三列(ID,類別,起始日期,結束日期)
  • 第二個也具有相同的三列(ID,類別,起始日期,結束日期)
  • 第三個三列

我已創建SQL腳本,返回1,如果從所述第二表中的一行是在限定的時間內(密鑰,組別,類別2)給定ca的第一張表tegory(其中table1.ID = table2.ID和table1.category = table2.category)。

我想什麼現在要做的是創建檢查SQL腳本如果從第二個表中的一行是第一個表中定義爲給定的分類和ID的期限內,或者是在有效期內的定義ID1_StartDate和ID2_EndDate(如果ID1和ID2是連續的,意味着它們具有相同的類別,並且如果我們按日期升序排列,則此類別id2在id1之後),如果這兩個類別在表格3中存在這樣的關係。

+3

它總是會有助於表明Oracle版本並表現出一定的數據行,並從該數據預期輸出 – RichardTheKiwi 2011-02-24 17:18:28

+1

真的需要一些標點符號... – 2011-02-24 17:19:57

回答

2

下面的查詢將返回table1的ID,如果這兩個條件都爲真:

1)由表1中所描述的時間範圍相交於所有的時間範圍在表2

2)的時間表1所描述的範圍與從表2中的行的開始日期開始的日期範圍相交,並且在具有相同類別的表2中的下一個時間順序行的結束日期處結束。

select distinct table1.id 
from table1 
inner join (select id, 
        category, 
        startdate, 
        enddate, 
        lead(enddate) 
         over (partition by category 
           order by enddate) as next_enddate 
      from table2) 
on (table1.startdate < table2.enddate 
    or table1.startdate < table2.next_enddate) 
    and table1.enddate >= table2.startdate 
    and table1.ID = table2.ID 
    and table1.category = table2.category 

我不完全理解在這種情況下使用第三張表,所以暫時忽略它。希望這會讓你更接近你正在尋找的答案。

+0

由於的JOIN,不能有重複的記錄TABLE1如果有不止一個TABLE2/3條相關記錄。 – 2011-02-24 18:06:18

+0

@OMG Ponies:好點,但是如果OP只是檢查存在,就像他在他的例子中一樣(在這種情況下只需檢索第一行就足夠了)。無論如何,我已經添加了'distinct'來糾正這個問題。 – Allan 2011-02-24 20:48:19

+0

+1:GROUP BY也可以 – 2011-02-24 20:57:54