我現在有這樣一張表,a2 ,a3為日期欄位,分別是開始日期,結束日期
我現在想做的是,當我在新插入一記錄的時候,要判斷一下新記錄的,開始時間和結束時間,是不是在現有記錄里面有沒有覆寫,如果有覆寫就不能插入
比如說我要插入一條記錄的日期為 2019-01-15 / 2019-01-25 這條記錄的日期有一個時間覆寫了,所以插入不成功。
或者 2019-01-25 / 2019-02-05也是不符合插入條件的,只有不重復的時間段才可以插入。
在ORACLE上面這個SQL怎么寫
id a1 a2 a3
1 1001 2019-01-04 2019-01-10
2 1002 2019-01-20 2019-02-10
......................
uj5u.com熱心網友回復:
你把a2、a3設為主鍵不就可以了嗎uj5u.com熱心網友回復:
insert into table ( a2, a3)select a2,a3 from table_new t
where not exists (select 1 from table t1 where t1.a2<=t.a3 and t1.a3>=t.a2)
uj5u.com熱心網友回復:
merge into 了解一下uj5u.com熱心網友回復:
insert into table ( a2, a3)
select a2,a3 from table_new t
where not exists
(select 1 from table t1
where (t1.a2 between t.a2 and t.a3) or
and (t1.a3 between t.a2 and t.a3)
)
uj5u.com熱心網友回復:
這個陳述句不對吧。。我現在有這樣一個記錄資料
但我要插入 2019-1-1到2019-3-1這個時間段的資料,資料庫現有記錄應該有這所要插入的記錄時間段是有重疊的
但現在執行出來居然是可以插入?
select * from CUX_TEST ;
select * from CUX_TEST t1 where trunc(t1.a2)<=to_date('2019-01-01' , 'yyyy/mm/dd') and t1.a3>=to_date('2019-03-01' , 'yyyy/mm/dd')
uj5u.com熱心網友回復:
你這不是自己把條件找到了么,加上去啊。uj5u.com熱心網友回復:
什么意思?沒有明白uj5u.com熱心網友回復:
select * from CUX_TEST t1 where trunc(t1.a2)<=to_date('2019-01-01' , 'yyyy/mm/dd') and t1.a3>=to_date('2019-03-01' , 'yyyy/mm/dd')
你的意思是這個sql 查詢出來是空的, 所以你認為不對是吧.
肯定不對呀, 我的sql邏輯, 判斷2段閉區間是否有交集:
舊的開始時間<= 新的結束時間 且 舊的結束時間>=新的開始時間;
但是你的sql邏輯是:
舊的開始時間<=新的開始時間 且 舊的結束時間>=新的結束時間;
uj5u.com熱心網友回復:
按你的意思,就是分為三種或關系的情況。new_start between old_start and old_end or
new_end between old_start and old_end or
(new_start < old_start and new_end > old_end)
直接加上去不就行了?
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/21226.html
標籤:高級技術
上一篇:自定義函式回傳資料集但是總是報錯:PLS-00905: 物件 ORCL_ONE.V_TABLE_LD_TB 無效
