SQL Server/TSQL:查询以获取大型名称行

SQL Server/TSQL:查询以获取大型名称行,tsql,sql-server-2012,Tsql,Sql Server 2012,我有一个字段名为的表: TABLE Name WANTED: ----------------- Done This Barcel Barcelona This Paris Parisinos This 短名字是坏名字。我不需要那些文件 sql server中的查询是哪个?不确定您希望如何处理重复项,但这会产生您想要的结果 DECLARE @

我有一个字段名为的表:

TABLE

Name                     WANTED:
-----------------
Done                       This
Barcel
Barcelona                  This
Paris
Parisinos                  This
短名字是坏名字。我不需要那些文件


sql server中的查询是哪个?

不确定您希望如何处理重复项,但这会产生您想要的结果

DECLARE @Name TABLE (
     Name VARCHAR(20)
)

INSERT INTO @Name SELECT 'Done'
INSERT INTO @Name SELECT 'Barcel'
INSERT INTO @Name SELECT 'Barcelona'
INSERT INTO @Name SELECT 'Paris'
INSERT INTO @Name SELECT 'Parisinos'

DELETE t2
from @Name t1
INNER JOIN @Name t2 ON t1.Name LIKE t2.Name + '%'
    AND t1.Name<>t2.Name

SELECT * FROM @Name
DECLARE@Name表(
名称VARCHAR(20)
)
插入到@Name中选择“完成”
插入@Name选择“Barcel”
插入@Name选择“巴塞罗那”
插入@Name选择“Paris”
插入@Name选择“巴黎人”
删除t2
来自@Name t1
t1上的内部联接@Name t2.Name类似于t2.Name+'%'
和t1.Namet2.Name
从@Name中选择*

不确定您希望如何处理重复项,但这会产生您想要的结果

DECLARE @Name TABLE (
     Name VARCHAR(20)
)

INSERT INTO @Name SELECT 'Done'
INSERT INTO @Name SELECT 'Barcel'
INSERT INTO @Name SELECT 'Barcelona'
INSERT INTO @Name SELECT 'Paris'
INSERT INTO @Name SELECT 'Parisinos'

DELETE t2
from @Name t1
INNER JOIN @Name t2 ON t1.Name LIKE t2.Name + '%'
    AND t1.Name<>t2.Name

SELECT * FROM @Name
DECLARE@Name表(
名称VARCHAR(20)
)
插入到@Name中选择“完成”
插入@Name选择“Barcel”
插入@Name选择“巴塞罗那”
插入@Name选择“Paris”
插入@Name选择“巴黎人”
删除t2
来自@Name t1
t1上的内部联接@Name t2.Name类似于t2.Name+'%'
和t1.Namet2.Name
从@Name中选择*

这适用于您拥有的数据:

样本数据:

IF OBJECT_ID('tempdb..#Names') IS NOT NULL
    DROP TABLE #Names;

CREATE TABLE #Names(Name VARCHAR(100));

INSERT INTO #Names
VALUES
      ('Done'),
      ('Barcel'),
      ('Barcelona'),
      ('Paris'),
      ('Parisinos');
查询:

WITH CTE
    AS (SELECT A.Name
            , B.Name AS B_NAME
            , ROW_NUMBER() OVER(PARTITION BY B.Name ORDER BY A.Name DESC) AS RN
        FROM   #Names AS A
             LEFT OUTER JOIN #Names AS B ON A.Name LIKE B.Name+'%')
    SELECT DISTINCT
          Name
    FROM   CTE
    WHERE  RN = 1;
结果:

但如果您有以下情况:

IF OBJECT_ID('tempdb..#Names') IS NOT NULL
    DROP TABLE #Names;

CREATE TABLE #Names(Name VARCHAR(100));

INSERT INTO #Names
VALUES
      ('Done'),
      ('Barcel'),
      ('Barcelona'),
      ('Paris'),
      ('Parisinos'),
      ('Parisians');

我不确定您希望如何处理它。

这将适用于您拥有的数据:

样本数据:

IF OBJECT_ID('tempdb..#Names') IS NOT NULL
    DROP TABLE #Names;

CREATE TABLE #Names(Name VARCHAR(100));

INSERT INTO #Names
VALUES
      ('Done'),
      ('Barcel'),
      ('Barcelona'),
      ('Paris'),
      ('Parisinos');
查询:

WITH CTE
    AS (SELECT A.Name
            , B.Name AS B_NAME
            , ROW_NUMBER() OVER(PARTITION BY B.Name ORDER BY A.Name DESC) AS RN
        FROM   #Names AS A
             LEFT OUTER JOIN #Names AS B ON A.Name LIKE B.Name+'%')
    SELECT DISTINCT
          Name
    FROM   CTE
    WHERE  RN = 1;
结果:

但如果您有以下情况:

IF OBJECT_ID('tempdb..#Names') IS NOT NULL
    DROP TABLE #Names;

CREATE TABLE #Names(Name VARCHAR(100));

INSERT INTO #Names
VALUES
      ('Done'),
      ('Barcel'),
      ('Barcelona'),
      ('Paris'),
      ('Parisinos'),
      ('Parisians');

我不确定您想如何处理它。

我执行了这个查询,它在我的数据库中工作。它也是“完成”名称的上下文吗“完成”是正确的结果否,据我所知,它不包括“完成”。我相信“%”使“0”个额外字符也可以匹配。您需要确保至少有一个字符可供删除,您可以查看。我执行了这个查询,它在我的数据库中工作。它也是“完成”名称的上下文吗“完成”是正确的结果否,据我所知,它不包括“完成”。我相信“%”使“0”个额外字符也可以匹配。您需要确保至少有一个字符可供删除,您可以查看。基本上是做‘’