[英]Oracle SQL comparing two columns in a for loop
我試圖基於兩個日期比較SQL表中的兩列。 設置該表是為了使表A中的每個人都具有另一個表B的外鍵,每個人可以在表B中具有多個條目。表B中的每個條目都包含開始日期和結束日期,我正嘗試抓住每個表B中有重疊的人員,因此其中一個條目的開始日期早於任何其他條目的結束日期。
因此,表A中的John Doe在表B中有兩個條目,其中條目1的開始日期是2015年4月5日,結束日期是2016年4月6日,第二個條目是2016年1月10日並且結束於2017年1月10日,所以我想包括我的結果集中的這個人。
但是表A中的Jane Doe作為表B中的兩個條目
Entry 1: SD April 10th 2014 End April 10th 2015
Entry 2: SD May 11th 2015 End May 11th 2016
因此,我不想在結果集中包含Jane Doe。
我想我需要在select語句的where部分中使用兩個嵌套的for循環,這取決於我是否要包含此人,來回翻轉變量。
遵循以下原則
Select * from A
where
(reset variable
for b in
(select * from b.id = A.b_id); loop
for btwo in
(select * from b.id = A.b_id); loop
// set variable based on start / end date
// if I want to include set var = 1 else 0
end loop;
end loop;)
variable = 1;
您已為兩個數據庫系統標記了該問題-我的回答與Oracle有關。
此處無需使用循環,因為您可以使用SQL分析函數LAG來處理此類問題。
以下內容將提供您想要的結果:
SELECT DISTINCT T.NAME
FROM (SELECT A.NAME,
B.START_DATE,
B.END_DATE,
LAG(B.START_DATE) OVER (PARTITION BY A.NAME ORDER BY B.NAME, B.START_DATE) AS PREV_START,
LAG(B.END_DATE) OVER (PARTITION BY A.NAME ORDER BY B.NAME, B.START_DATE) AS PREV_END
FROM A
INNER JOIN B
ON B.NAME = A.NAME
ORDER BY A.NAME) T
WHERE (T.START_DATE BETWEEN T.PREV_START AND T.PREV_END) OR
(T.END_DATE BETWEEN T.PREV_START AND T.PREV_END) OR
(T.PREV_START BETWEEN T.START_DATE AND T.END_DATE) OR
(T.PREV_END BETWEEN T.START_DATE AND T.END_DATE);
這是我的建議。 要獲得重疊,可以使用:
select b.*
from tableb b
where exists (select 1
from tableb b2
where b.aid = b2.aid and
b.startdate < b2.enddate and b.enddate > b.startdate
);
邏輯很簡單。 如果第一個時間間隔在第二個時間間隔之前開始,而第一個時間間隔在第二個時間間隔之后開始,則兩個時間間隔重疊。
要獲取表的值:
with overlaps as (
select b.*
from tableb b
where exists (select 1
from tableb b2
where b.aid = b2.aid and
b.startdate < b2.enddate and b.enddate > b.startdate
)
)
select a.*
from tablea a
where a.aid in (select o.aid from overlaps o);
注意:根據您定義“重疊”的方式,您可能需要<=
和>=
進行比較。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.