2012-08-02 183 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) 

这个工作对我很好,谢谢