1. 程式人生 > >在論壇中出現的比較難的sql問題:10(刪除多表中的同一個外來鍵)

在論壇中出現的比較難的sql問題:10(刪除多表中的同一個外來鍵)

最近,在論壇中,遇到了不少比較難的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)