2012-08-02 102 views
0

我想在列上輸入fk或索引,只要這樣的約束不存在。如果它存在,名稱不是我想要的名稱,只需重命名它,否則什麼都不做。爲此,我正在檢查SQL服務器的sys表或Oracle的all _...表。sql複雜選擇語句

這裏是我的問題簡化爲可能:

index_name    column_name 
on_multiple_columns1 a 
on_multiple_columns1 b 

on_multiple_columns2 a 
on_multiple_columns2 b 
on_multiple_columns2 c 

on_single_column1  b 

on_single_column2  c 

現在我需要一個選擇INDEX_NAME到@constraintToRename聲明,這樣我就可以在@constraintToRename重命名爲「MYNAME」,如果它存在,並且尚未有名字'myName',或者如果沒有創建一個新的。 我與有關列和「MYNAME」 如信息來:

選擇INDEX_NAME到@toRename從「some_index_table」加入「some_other_index_table」 其中「指數僅在指定的列什麼,我進入現在,所以沒有多列索引返回等等'

在我的情況下,我想輸入一個索引myName =測試列b。當我只選擇列b的名稱時,我會得到3個索引(on_multiple_columns1,on_multiple_columns2和右邊的on_single_column1),但我只需要on_single_column1,因此我可以將其重命名爲測試。 我該如何做到這一點? 喜歡的東西

select ... where column = 'my_column' and count(index_names) = 1 

select .... where column = 'my_column' and index_name !corresponds to other columns :) 

我如何在SQL表達呢? 感謝 SSS

+0

使用[按](HTTP:// MSDN。 microsign.com/en-us/library/ms177673.aspx)index_name [having](http://msdn.microsoft.com/en-us/library/ms180199)count(*)= 1 – 2012-08-02 22:25:41

+0

@NikolaMarkovinović:問題這就是說,當我有where列='my_column',那麼所有索引都有count(*)= 1。當我沒有column ='my_column'時,那麼我得到所有index_names指定只在一列上 - >在這種情況下on_single_column1和2,但我只想要對應於列b - > on_single_column1 – radio 2012-08-03 07:16:50

回答

0

上面我現在用這一個評論建議的啓發:

select index_name from <table> where column_name='b' and index_name in 
(select index_name from <table> group by index_name having COUNT(index_name) = 1) 

這個工作對我很好,謝謝