我有张桌子看起来像这样:
acronym | word
FCN | FCN
FCN | Fourth Corner Neurosurgical Associates
FHS | FHS
HW | HW正如你所看到的,有些缩略词有匹配的词,有些没有。我想保留那些有匹配词的缩略词。对于没有匹配词的缩略语,我想保留缩略语本身。我希望结果表如下所示:
acronym | word
FCN | Fourth Corner Neurosurgical Associates
FHS | FHS
HW | HW我还想不出有什么办法能做到这一点。可能按“缩写”分组并选择"word",但有什么算法可以决定删除"FCN“或”第四角神经外科协会“
发布于 2014-03-31 17:56:19
假设不可能有“坏”的话:
DELETE myTable
FROM myTable del
WHERE [acronym] = [word]
AND EXISTS ( SELECT *
FROM myTable lw -- Longer Word
WHERE lw.[acronym] = del.[acronym]
AND Len(lw.[word]) > Len(lw.[acronym]) )或者你想要避免删除SQL|SQL时,有一个‘坏’的其他(更长的)记录读eg。SQL|Strange Things Happen?
重读这个问题,我现在很怀疑,如果你真的想要DELETE那些记录,或者只是想要SELECT与定制的记录过滤出去。在后一种情况下,您必须使用(包括mellamokb的建议)
SELECT [acronym], [word]
FROM myTable mt
WHERE [acronym] <> [word]
OR NOT EXISTS ( SELECT *
FROM myTable lw
WHERE lw.[acronym] = mt.[acronym]
AND lw.[word] <> lw.[acronym] )发布于 2014-03-31 18:02:50
根据您的数据,您可能可以使用区分语句和Case语句的组合。
select distinct acronym,
(case acronym when word then word else acronym end) as Abbr
from acronyms发布于 2014-03-31 18:08:22
试试这个:
create table #t (acronym varchar(100), word varchar(100));
go
insert #t values
('FCN', 'FCN'),
('FCN', 'Fourth Corner Neurosurgical Associates'),
('FHS', 'FHS'),
('HW', 'HW');
go
;with x as (
select *,
row_number() over(partition by acronym order by case when acronym=word then 1 else 0 end) as rn
from #t
)
delete x where rn <> 1;https://stackoverflow.com/questions/22768571
复制相似问题