例如:
A表
欄位(主鍵) 欄位2
1 abc;def
2 123;456
B表
欄位(主鍵) 欄位2
3 abcd
4 456
判斷A表欄位2以分號隔開的值是否在B表中存在,存在則不記錄,反之記錄該資料.
例子回傳的A表資料
1 abc
1 def
2 123
請教這個sql怎么寫啊
uj5u.com熱心網友回復:
判斷A表欄位2以分號隔開的值是否在B表中存在,存在則不記錄,反之記錄該資料.例子回傳的A表資料
1 abc
1 def
2 123
沒看明白這個邏輯為什么會回傳這個資料?
uj5u.com熱心網友回復:
1 def這個資料,是根據什么規則包含的?
uj5u.com熱心網友回復:
select a.col1,b.col2from a,b
where instr(a.col2,b.col2)>0;
比較簡單一點的是instr,就是上例,不過有缺陷,比如b表欄位是ab,而不是abc也會匹配到。
復雜點的是把a表中的欄位2全行轉列,然后再精確匹配b表欄位2
uj5u.com熱心網友回復:
其實就是把A表中欄位2的已分號拆開后的值,判斷在B表欄位2中是否存在
uj5u.com熱心網友回復:
把A表欄位2的值以分號隔開然后在判斷B表是否存在,不存在的話就記錄
uj5u.com熱心網友回復:
參考一下這個,對你有幫助;http://bbs.csdn.net/topics/392043373
uj5u.com熱心網友回復:
先拆分再匹配。將a表的1 abc;def 拆成形如
1 abc
1 def
再關聯b表
其實從效率上來將,用存盤程序來處理可能會更合適
uj5u.com熱心網友回復:
select aaaa.id,aaaa.str from (select distinct aaa.id, aaa.str, aaa.flag,count(*) count
from (select aa.id,
aa.str str,
b.str str1,
case
when aa.str = b.str then
1
else
0
end flag
from (select a.id, to_char(wm_concat(a.str)) str
from (select t.id,
case
when instr(t.str, ';') > 0 then
substr(t.str, 1, instr(t.str, ';') - 1)
end str, --如果有分號,則切割分號前半部分欄位
case
when instr(t.str, ';') > 0 then
substr(t.str,
instr(t.str, ';') + 1,
length(t.str) - instr(t.str, ';')) --切割欄位
end str1 --如果有分號,則切割分號后半部分欄位
from (select 1 ID, 'abc;def' str
from dual
union all
select 2, '123;456' from dual) t) a
group by a.id --進行分號前半部分的行轉列
union
select a.id, to_char(wm_concat(a.str1)) str
from (select t.id,
case
when instr(t.str, ';') > 0 then
substr(t.str, 1, instr(t.str, ';') - 1)
end str, --如果有分號,則切割分號前半部分欄位
case
when instr(t.str, ';') > 0 then
substr(t.str,
instr(t.str, ';') + 1,
length(t.str) - instr(t.str, ';')) --切割欄位
end str1 --如果有分號,則切割分號后半部分欄位
from (select 1 ID, 'abc;def' str
from dual
union all
select 2, '123;456' from dual --測驗資料
) t) a
group by a.id --進行分號后半部分的行轉列
) aa
left join
(select 3 ID, 'abcd' str
from dual
union all
select 4, '456' from dual --測驗資料
) b on 1 = 1 --產生笛卡爾乘積如切割后的欄位與B表中相同則標記為1,不同則標記為0
) aaa
group by aaa.id, aaa.str, aaa.flag
) aaaa where aaaa.flag=0 and aaaa.count=(select count(*) from (select 3 ID, 'abcd' str
from dual
union all
select 4, '456' from dual ))
--把flga標記為0且在B表中都不存在的記錄列出來
貌似寫得有點復雜,僅供參考
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/104864.html
標籤:基礎和管理
