2015-06-23 18 views
6

Una tabella contiene record univoci per un campo specifico (FILENAME). Sebbene i record siano unici, in realtà sono solo duplicati con solo un testo aggiunto. Come puoi restituire e raggruppare record simili o simili e aggiornare i campi vuoti?Restituisce tutti i record in cui un campo ha lo stesso valore più testo aggiuntivo

La tabella seguente è tipica dei record. Ogni record ha un nome di file ma non è un campo chiave. C'è un record del database con i metadati che vorrei popolare per documentare i metadati che sono identificabili solo dai primi n caratteri.

La variabile è il nome del file originale sta cambiando sempre le lunghezze dei caratteri. La costante è che il prefisso è sempre lo stesso.

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 /   / 

La tabella dovrebbe apparire così.

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 

ho cercato di unire la tabella su se stessa e verificare la lunghezza ma "sinistra (nome file, 10)" non restituisce tutti i risultati.

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) 

Anche provato qualcos'altro in base a un post simile, ma in realtà non funziona neanche.

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

il problema principale è quello di trovare il primo carattere non numerico nella colonna FILENAME .... – CeOnSql

+2

usando 'LIKE' per il confronto nome del file è pericoloso, se si dispone di file di 52349 e 5234 – Eric

risposta

2

Prova questa

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

In primo luogo, si vuole ottenere i file di base o quelle righe in cui DWGNO IS NOT NULL. Quindi, ottenere le revisioni (DWGNO IS NULL) e fare un JOIN sui file di base:

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

Utilizzando come% può causare errato dati se c'è un nome di file come 523510 dato che è come il 52351%. Prova il seguente

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

Sei molto corretta su la tua stringa corrispondente commento. – shawnt00

0

Suppongo che le query interne siano scalari.

Fondamentalmente utilizza patindex() per trovare un carattere non numerico. (Penso di avere le chiamate di funzioni giuste.) Non abbiamo davvero bisogno di aggiornare le righe che non includono una di quelle. Per quelli che abbiamo bisogno di fare una ricerca sulla riga che ha il prefisso corrispondente come nome file completo. Tale prefisso è tutti i caratteri precedenti al valore restituito di 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 
Problemi correlati