首页 > 解决方案 > 在 SQL 中,如何检查与另一个相似的行值

问题描述

我正在使用 SQL Server (T-SQL)。我有一列包含行值 A、AB、ABC、AC。我想删除另一行包含的任何值。在这种情况下,我会留下 ABC 和 AC,因为 A 和 AB 包含在另外两个中。

我的想法是获取列的每个值并使用 LIKE 搜索整个列并计算返回的结果数如果它等于 1 则它不包含在其他行中。

这是一个好方法吗?我问是因为我不愿意使用循环/光标。

谢谢

这是从上面的解释中提取的代码示例:

CREATE TABLE #t (words varchar(10))
INSERT INTO #t 
VALUES ('A'),('AB'),('ABC'),('AC')

使用游标,我想我会做类似的事情:

DECLARE @branches TABLE (words varchar(10), n int)
DECLARE @word VARCHAR(10)
DECLARE cursor_word CURSOR

FOR SELECT words FROM #t

OPEN cursor_word;
FETCH NEXT FROM cursor_word INTO @word
WHILE @@FETCH_STATUS = 0
    BEGIN
        INSERT INTO @branches SELECT @word, COUNT(*) FROM #t WHERE words like CONCAT('%', @word ,'%')
        FETCH NEXT FROM cursor_word INTO @word
    END

CLOSE cursor_word
DEALLOCATE cursor_word

SELECT * FROM @branches WHERE n = 1

标签: sqlsql-server

解决方案


你可以尝试类似的东西

SELECT *
FROM (
    SELECT *
    , Row_Number() OVER(ORDER BY Words) N -- Create identifier for the row
    FROM #t
) t1
LEFT JOIN (
    SELECT *
    , Row_Number() OVER(ORDER BY Words) N -- Create identifier for the row
    FROM #t 
) t2 on t1.N <> t2.n -- Where the identifier is different 
    AND t2.Words LIKE t1.Words + '%' -- Where t2.Words starts with t1.Words
WHERE t2.Words IS NULL -- And there is no match of t2.

推荐阅读