2015-12-03 95 views
0

我有一个表,按以下拆分逗号分隔值代入行与SQL Server

名称

NameID | Name | NickNames 
-------------------------- 
    1 | Richard | Rich, Dick 
    2 | Sam | Samuel, Samantha, Sammy 
    3 | John | Jonathan, Johnny 

等等......

我有一个迭代函数已经是循环遍历这个表中的所有行,并且我有循环当前所在行的ID。我想删除表中'Name'列包含在当前行'NickNames'列中的所有行。

例如,第4行可能是:

4 | Johnathan | NULL 

我想对于此行,因为“乔纳森”出现在第3行的绰号被删除。

本质上,我试图选择NickNames列作为一系列行,而不是其原始的CSV类数据。的This Blog Post

在我眼里几乎是相反的,它看起来是这样的:

DELETE FROM Names WHERE Name IN (SELECT NickNames FROM Names WHERE [email protected]); 

提前感谢!

+0

如果“Johnny”是昵称为“John”的条目5的名称,会发生什么? NameID 3“John”和NameID 5“Johnny”是否应该删除? –

+0

@PaulWilliams在我的脑海中,入口5将被删除,一旦循环入口3,因此从来没有问题:) –

回答

1

你不需要循环来做到这一点。我承认下面可能不是最快的,但它是一个单独的语句:

delete from names n 
    where exists (select 1 
        from names n2 
        where ',' + n2.nicknames + ',' like '%,' + n.name + ',%' and 
         n2.nameid <> n.nameid 
       ); 

注意:你不应该在一个逗号分隔的列表中存储的东西名单。关系数据库每列只能有一个值。联结表是正确的方法。

+0

谢谢戈登,这比我希望的效果更好。 我知道在单个列中存储逗号分隔值的固有问题,但在这种情况下,由于我的数据库它是一个更干净的方法,并且它不应该导致性能问题,因为我赢得了很多表扫描真的不这样用 –