2016-03-22 6 views

答えて

1

重複をどのように処理するかはわかりませんが、これによって必要な結果が得られます。

これはあなたが持っているデータのために働くだろう
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 
+0

私はこのクエリを実行し、私のデータベースで動作します。それは '完了'の名前も考慮されていますか? 'done'は正しい結果です – David

+0

いいえ、私が知る限り、「完了」は含まれません。私は '%'がそれを "0"の余分な文字にもマッチさせると信じています。少なくとも1文字の削除が行われるようにしてください。 –

+0

https://msdn.microsoft.com/en-us/library/ms179859.aspxを参照してください。基本的に '_%' –

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'); 

はQUERY:

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; 

結果:

enter image description here

しかし、あなたは以下の持っている場合:

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'); 

私はあなたがそれを処理したいかどうかはわかりません。

関連する問題