在資料庫設計時,為了減少表儲存的記錄數,對於1對多的關係可以儲存在同乙個記錄中,例如某乙個應用會被多個人使用,有一種儲存方法如下:
這樣會造成記錄數會越來越多,還有一種方法可以用2條記錄儲存上述資料:
第一種方法的好處就是顯示員工名稱非常方便,和員工資訊表關聯即可;第二種方法如果要顯示維護人員的姓名就非常麻煩,例如我們有下面的兩張表:
if object_id('[emp]') is not null drop table [emp]
go create table [emp]([員工id] varchar(3),[姓名] varchar(4))
insert [emp]
select '001','張三' union all
select '002','李四' union all
select '003','***'
if object_id('[app]') is not null drop table [app]
go create table [app]([應用id] varchar(6),[應用名] varchar(5),[維護員工id] varchar(11))
insert [app]
select 'app001','應用a','001,002,003' union all
select 'app002','應用b','002,003'
要求的結果是對於app表顯示維護員工的姓名,那麼可以將問題分解,一步步求解。對於「001,002,003」這個如果要顯示其名稱,那麼可以用下面的語句:select ','+e.[姓名] from emp e
where charindex(','+e.[員工id]+',',','+'001,002,003'+',')>0
for xml path('')
得到的結果如下
如果要對app表中的每一條記錄都實現這樣的結果怎麼做呢
select distinct
[應用id],
[應用名],
[維護員工id],
stuff((select ','+e.[姓名] from emp e
where charindex(','+e.[員工id]+',',','+t.維護員工id+',')>0
for xml path('')
),1,1,'') as 維護員工姓名
from app t
最終結果
Mysql 同一欄位多值模糊查詢
同一欄位多值模糊查詢,使用多個or進行鏈結,效率不高,但沒有更好的解決方案。有看到charindex 關鍵字,可查詢結果並不是模糊,舉個栗子 例如select from table where charindex name 張三,李四 0 二 同一值多字段模糊查詢,使用concat關鍵字,舉個栗子 ...
多事務併發更新同一字段,引入鎖
總結注意下面的例子 事務1事務2 begin begin select data from test where id 1 得到 ab select data from test where id 1 得到 ab update test set data cb where id 1 update t...
oracle 批量更改所有表的同一字段型別
經常需要oracle中的所有的字段的型別更改為另外乙個型別,可以考慮利用如下 此處的demo為將nvarchar2轉為varchar2型別並且字段長度保持不變。declare cursor c tab is select from user tab columns t where t.data ty...