2015-06-23 8 views
6

Eine Tabelle enthält eindeutige Datensätze für ein bestimmtes Feld (FILENAME). Obwohl die Datensätze eindeutig sind, handelt es sich tatsächlich nur um Duplikate, an die nur Text angehängt ist. Wie können Sie ähnliche oder ähnliche Datensätze zurückgeben und gruppieren und die leeren Felder aktualisieren?Gibt alle Datensätze zurück, bei denen ein Feld denselben Wert plus zusätzlichen Text hat

Die folgende Tabelle ist typisch für die Datensätze. Jeder Datensatz hat einen Dateinamen, aber es ist kein Schlüsselfeld. Es gibt einen Datenbankdatensatz mit Metadaten, die ich füllen möchte, um Metadaten zu dokumentieren, die nur durch die ersten n Zeichen identifiziert werden können.

Die Variable ist der ursprüngliche Dateiname ändert sich immer Zeichenlängen. Die Konstante ist, dass das Präfix immer gleich ist.

FILENAME / DWGNO  / PROJECT 
52349  / 52349 / Ford 
52349-1.dwg/   /
52349-2.DWG/   /
52349-3.dwg/   /
52351  /  52351 / Toyota 
52351_C01_REV- /   /
52351_C01_REV2-/   /
123  /  123 /  Nissan 
123_rev1 /   / 
123_rev2 /   / 
123_rev3 /   / 

sollte die Tabelle wie folgt aussehen.

FILENAME  / DWGNO / PROJECT 
52349  / 52349 / Ford 
52349-1.dwg / 52349 / Ford 
52349-2.DWG / 52349 / Ford 
52349-3.dwg / 52349 / Ford 
52351  / 52351 / Toyota 
52351_C01_REV-/ 52351 / Toyota 
52351_C01_REV2-/  52351 / Toyota 
123   / 123  / Nissan 
123_rev1  / 123  / Nissan 
123_rev2  / 123  / Nissan 
123_rev3  / 123  / Nissan 

Ich versuchte zunächst, sich selbst auf den Tisch zu verbinden und die Länge überprüfen, aber „LEFT (Dateiname, 10)“ nicht alle Ergebnisse zurück.

USE MyDatabase 
SELECT  x.DWGNO AS X_DWGNO, 
    y.DWGNO AS Y_DWGNO, 
    x.FILENAME AS X_FILENAME 
    y.FILENAME AS Y_FILENAME 
    x.DWGTITLE, 
    x.REV, 
    x.PROJECT 
FROM  dbo.DocShare x 
-- want all the files from the left table... I think 
LEFT JOIN dbo.DocShare y 
ON  LEFT(FILENAME LEN(CHARINDEX('.', FILENAME 1))) = LEFT(FILENAME, 10) 

Auch etwas anderes versucht, basierend auf einem ähnlichen Beitrag, aber es funktioniert auch nicht wirklich.

USE MyDatabase 
SELECT  X.E_DWGNO, 
    y.DWGNO AS Y_DWGNO, 
    x.FILENAME AS X_FILENAME 
    y.FILENAME AS Y_FILENAME 
    x.DWGTITLE, 
    x.REV, 
    x.PROJECT 
FROM  dbo.DocShare x 
WHERE EXISTS(SELECT x.FILENAME 
     FROM dbo.DocShare 
     WHERE x.FILENAME = LEFT(y.FILENAME LEN(CHARINDEX('.', y.FILENAME, 0)))) 
ORDER BY y.FILENAME 
+0

das Hauptproblem ist die erste nicht-numerischen Zeichen in Spalte DATEI zu finden .... – CeOnSql

+2

mit 'LIKE' für Dateinamen Vergleich gefährlich ist, wenn Sie Datei 52349 und 5234 haben – Eric

Antwort

2

Versuchen Sie, diese

Sql Fiddle

select f2.Filename,f1.DWGNO,f1.Project 
from File1 f2 left join File1 f1 on 
f2.Filename like f1.Filename+'%' 
where f1.DWGNO != '' 
2

Zuerst möchten Sie die Basisdateien oder jene Zeilen, in denen DWGNO IS NOT NULL bekommen. Dann erhalten die Revisionen (DWGNO IS NULL) und machen einen JOIN auf den Basisdateien:

SQL Fiddle

WITH CteBase AS (
    SELECT * FROM Tbl WHERE DWGNO IS NOT NULL 
), 
CteRev AS(
    SELECT 
     t.FileName, 
     DWGNO = cb.DWGNO, 
     Project = cb.Project 
    FROM Tbl t 
    INNER JOIN CteBase cb 
     ON t.FileName LIKE cb.FileName + '%' 
    WHERE t.DWGNO IS NULL 
) 
SELECT * FROM CteBase 
UNION ALL 
SELECT * FROM CteRev 
ORDER BY FileName 
0

wie% Verwendung in falsche führen Daten, wenn es einen Dateinamen wie 523510 gibt, wie es 52351% ist. Versuchen Sie die folgende

USE MyDatabase 
SELECT  x.DWGNO AS X_DWGNO, 
    y.DWGNO AS Y_DWGNO, 
    x.FILENAME AS X_FILENAME 
    y.FILENAME AS Y_FILENAME 
    x.DWGTITLE, 
    x.REV, 
    x.PROJECT 
FROM  dbo.DocShare x 
-- want all the files from the left table... I think 
LEFT JOIN dbo.DocShare y 
ON  left(y.[FileName],PATINDEX('%[^0-9]%', y.[FileName])-1) = x.[FILENAME] 
+1

Sie sind sehr viel richtig zu Ihr String-Kommentar. – shawnt00

0

Ich nehme an, die inneren Abfragen sind skalar.

Im Grunde wird patindex() verwendet, um ein Zeichen ohne Ziffer zu finden. (Ich denke, ich habe die Funktionsaufrufe richtig.) Wir müssen wirklich keine Zeilen aktualisieren, die keinen von denen enthalten. Für diejenigen, die tun müssen, müssen wir die Zeile mit dem passenden Präfix als vollständigen Dateinamen nachschlagen. Dieses Präfix sind alle Zeichen vor dem Rückgabewert patindex().

update dbo.DocShare 
set DWGNO = (
     select DWGNO 
     from dbo.DocShare as ds 
     where ds.FILENAME = 
      left(
       dbo.DocShare.FILENAME, 
       patindex('%[^0-9]%', dbo.DocShare.FILENAME + '_') - 1 
      ) 
    ), 
    PROJECT 
     select PROJECT 
     from dbo.DocShare as ds 
     where ds.FILENAME = 
      left(
       dbo.DocShare.FILENAME, 
       patindex('%[^0-9]%', dbo.DocShare.FILENAME + '_') - 1 
      ) 
) 
where patindex('%[0-9]%', FILENAME + '_') > 0 
Verwandte Themen