1

我有一个包含两个 NVARCHAR 列的表:源和目标。

我想找到您可以找到具有相同源和包含当前行的目标的另一行的行。

在下面的示例中,我想查找第 1 行和第 7 行:

  • 第 1 行是第 3 行的“部分重复”
  • 第 7 行是第 6 行的“部分重复”

下面是一段 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 中完成它。

最终目标是删除“部分重复”。

4

1 回答 1

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 || '%'
       )
     ;
于 2013-04-12T13:46:55.397 回答