我有两个NVARCHAR列的表:source和target。
我想找到可以找到具有相同来源的另一行以及包含当前行的目标的行。
在下面的示例中,我想查找第1行和第7行:
以下是一段SQL代码:
CREATE TABLE #YourTable (ID int, [source] nvarCHAR(12), [target] nvarCHAR(12))
INSERT INTO #YourTable ([ID],[source],[target]) VALUES (1,'wordA','word1')
INSERT INTO #YourTable ([ID],[source],[target]) VALUES (2,'wordA','word2')
INSERT INTO #YourTable ([ID],[source],[target]) VALUES (3,'wordA','word3 ; word1')
INSERT INTO #YourTable ([ID],[source],[target]) VALUES (4,'wordB','word4')
INSERT INTO #YourTable ([ID],[source],[target]) VALUES (5,'wordC','word5')
INSERT INTO #YourTable ([ID],[source],[target]) VALUES (6,'wordD','word6 ; word7')
INSERT INTO #YourTable ([ID],[source],[target]) VALUES (7,'wordD','word7')
SELECT
[source],
STUFF((
SELECT ', ' + [target]
FROM #YourTable
WHERE ([source] = Results.[source])
FOR XML PATH (''))
,1,2,'') AS NameValues
FROM #YourTable Results
GROUP BY [source]
HAVING COUNT(1)>1
DROP TABLE #YourTable
我的第一个想法是连接,但它不会让我更接近解决方案......
我可以将我的数据导出为CSV并使用编程语言(python,C#,...)来隔离ID,但我很想知道如何在SQL中完成它。
最终目标是删除“部分重复”。
答案 0 :(得分:1)
您的工作可以使用exists
运营商完成:
delete
from #yourtable t1
where exists (
select 1
from #yourtable t2
where t2.source = t1.source
and t2.target <> t1.target
and t2.target like t1.target || '%'
)
;