在論壇中出現的比較難的sql問題:10(刪除多表中的同一個外來鍵)
阿新 • • 發佈:2019-02-16
最近,在論壇中,遇到了不少比較難的sql問題,雖然自己都能解決,但發現過幾天后,就記不起來了,也忘記解決的方法了。
所以,覺得有必要記錄下來,這樣以後再次碰到這類問題,也能從中獲取解答的思路。
1、求助!SQLServer如何刪除多表(10表以上)中的同一個外來鍵。http://bbs.csdn.net/topics/390633551
最近在做一個OA系統,用SQLServer2008資料庫。系統裡有個刪除員工的功能,但是考慮到其他表中有員工表的外來鍵,刪除時應該將其他表中相關的記錄全部刪除,請問如何寫語句?
比如員工表是OA_User,員工編號Uid,資料庫中最少有10張表裡有Uid外來鍵,請問如何刪除其他表中的相關記錄?
也可以通過圖形化操作來實現:create table OA_User(Uid int primary key ,uname varchar(20)) create table OA_tb ( id int identity(1,1)primary key , Uid int foreign key references OA_User(Uid) on delete cascade --級聯刪除 ) insert into OA_User values(1,'張三'), (2,'李四') insert into OA_tb values(1),(1),(1),(2),(1) --刪除主表中udi 為2的記錄,沒有報錯 delete from oa_user where uid = 2 --附表中的uid為2的記錄,自動刪除 select * from oa_tb /* id Uid 1 1 2 1 3 1 5 1 */
2、統一改換查詢出的欄位。。這是不是想多了?
能不能這樣
select A.* as A_*
from QAQuestion Q
inner join QAAnswer A ON A.QuestionID = Q.ID
簡單地說,不想一個個地去給每個欄位as別名
我如上去寫只是打個比方。。實際執行不了的,想得到的查詢結果是
A_欄位1,A_欄位2,A_欄位3,A_欄位4
有沒有辦法呢?
我的回覆:
本質上來說,只有在sql server端,能把select a.* as a_*,也就是自動進行轉換,才能支援。
因為在sql server端,你寫的sql語句是各式各樣的,要想實現你的A.* as A_*,實際上就是要改寫查詢,改為:
select a.欄位1 as a_欄位1,
a.欄位2 as a_欄位2,
a.欄位3 as a_欄位3,
from a
下面是通過動態語句來實現的:
--先建個表
select * into wc_table
from sys.objects
/*
要實現
select a.* as a_*
from wc_table
的效果
*/
--動態生成語句為:
declare @sql varchar(max);
set @sql = '';
select @sql = @sql + ',' + c.name + ' as A_' + c.name
from sys.tables t
inner join sys.columns c
on t.object_id = c.object_id
where t.name = 'wc_table'
order by c.column_id
set @sql = 'select ' +
STUFF(@sql,1,1,'') +
' from wc_table A'
select @sql
/*
我把結果格式化了一下就是這樣:
SELECT name AS A_name,
object_id AS A_object_id,
principal_id AS A_principal_id,
schema_id AS A_schema_id,
parent_object_id AS A_parent_object_id,
type AS A_type,
type_desc AS A_type_desc,
create_date AS A_create_date,
modify_date AS A_modify_date,
is_ms_shipped AS A_is_ms_shipped,
is_published AS A_is_published,
is_schema_published AS A_is_schema_published
FROM wc_table A
*/
exec(@sql)