返回字段具有相同值和附加文本的所有记录

bol*_*cho 6 sql sql-server sql-server-2008

表包含特定字段的唯一记录(FILENAME).虽然记录是唯一的,但实际上它们只是附加了一些文本的重复记录.如何返回和分组相似或类似的记录并更新空字段?

下表是典型的记录.每条记录都有一个文件名,但它不是一个关键字段.有一个带有元数据的数据库记录,我想填充这些记录以记录只能由前n个字符识别的元数据.

变量是原始文件名始终改变字符长度.常量是前缀始终相同.

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     /                /     
Run Code Online (Sandbox Code Playgroud)

该表应如下所示.

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
Run Code Online (Sandbox Code Playgroud)

我首先尝试加入表格并检查长度,但"LEFT(FILENAME,10)"没有返回所有结果.

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)
Run Code Online (Sandbox Code Playgroud)

还尝试了基于类似帖子的其他内容,但它也没有真正起作用.

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 
Run Code Online (Sandbox Code Playgroud)

Sim*_*lia 2

尝试这个

sql小提琴

select f2.Filename,f1.DWGNO,f1.Project
from File1 f2 left join File1 f1 on
f2.Filename like f1.Filename+'%'
where f1.DWGNO != '' 
Run Code Online (Sandbox Code Playgroud)