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)
尝试这个
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)