Microsoft Access SQL 逗号分隔值
Posted
技术标签:
【中文标题】Microsoft Access SQL 逗号分隔值【英文标题】:Microsoft Access SQL Comma Delimited Values 【发布时间】:2017-12-04 17:17:57 【问题描述】:我有一个数据集,其主键名为 authors 和一个名为 books 的字段。
表格看起来像这样:
Authors (primary key) Books
John Fathom,Mouseover,Keycard
Kyle Teachers,Carl,Phone
我知道这违反了 1NF,我正在尝试创建一个新表(一对多关系),其中每本书的主键(作者)出现不止一次。即
Authors Books
John Fathom
John Mouseover
John Keycard
Kyle Teachers
Kyle Carl
Kyle Phone
我需要在microsoft access中使用sql,我认为它涉及到split功能,但是我不知道如何执行这个查询。
任何见解将不胜感激!
非常感谢
【问题讨论】:
你有多少条记录? 超过 1000 个,我相信手动操作太多了 SQL Split column based on 1 or more possible delimiter and insert in new table 的可能重复项(正如我在那里所说,您要么必须使用 VBA,要么必须使用非常有限的逗号(2 个可行,更多是麻烦)) 您好 Erik,感谢您的回复,我的数据中最多有 2 个逗号。我看到您发布的 sql 代码,但我不确定如何将其放入 SQL 【参考方案1】:好吧,由于代码很难实现,而你只有 2 个,我想我可以分享一个实现的解决方案:
(将MyTable
替换为您的表名,并找到所有字段名并将其替换为正确的名称):
SELECT * Into NewTable FROM (
SELECT Author, IIf(InStr(1, [Books], ',') = -1, [Books], Left([Books], InStr(1, [Books], ',') - 1)) As Book
FROM MyTable
WHERE IIf(InStr(1, [Books], ',') = -1, [Books], Left([Books], InStr(1, [Books], ',') - 1)) <> ""
UNION ALL
SELECT Author, IIf( InStr(1,[Books],',')> 0, IIf(InStr(InStr(1,[Books],',') + Len(','), [Books] , ',') < 1, Mid([Books], InStr(1,[Books],',') + Len(',')), Mid([Books], InStr(1,[Books],',') + Len(','), InStr(InStr(1,[Books],',') + Len(','), [Books] , ',') - InStr(1,[Books],',') - Len(','))), "") As Book
FROM MyTable
WHERE IIf( InStr(1,[Books],',')> 0, IIf(InStr(InStr(1,[Books],',') + Len(','), [Books] , ',') < 1, Mid([Books], InStr(1,[Books],',') + Len(',')), Mid([Books], InStr(1,[Books],',') + Len(','), InStr(InStr(1,[Books],',') + Len(','), [Books] , ',') - InStr(1,[Books],',') - Len(','))), "") <> ""
UNION ALL
SELECT Author, IIf( InStr(InStr(1,[Books],',') + Len(','), [Books],',')> 0, IIf(InStr(InStr(InStr(1,[Books],',') + Len(','), [Books],',') + Len(','), [Books] , ',') < 1, Mid([Books], InStr(InStr(1,[Books],',') + Len(','), [Books],',') + Len(',')), Mid([Books], InStr(InStr(1,[Books],',') + Len(','), [Books],',') + Len(','), InStr(InStr(InStr(1,[Books],',') + Len(','), [Books],',') + Len(','), [Books] , ',') - InStr(InStr(1,[Books],',') + Len(','), [Books],',') - Len(','))), "") As Book
FROM MyTable
WHERE IIf( InStr(InStr(1,[Books],',') + Len(','), [Books],',')> 0, IIf(InStr(InStr(InStr(1,[Books],',') + Len(','), [Books],',') + Len(','), [Books] , ',') < 1, Mid([Books], InStr(InStr(1,[Books],',') + Len(','), [Books],',') + Len(',')), Mid([Books], InStr(InStr(1,[Books],',') + Len(','), [Books],',') + Len(','), InStr(InStr(InStr(1,[Books],',') + Len(','), [Books],',') + Len(','), [Books] , ',') - InStr(InStr(1,[Books],',') + Len(','), [Books],',') - Len(','))), "") <> ""
)
【讨论】:
以上是关于Microsoft Access SQL 逗号分隔值的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Microsoft SQL Server Management Studio 中将多行合并为一行,用逗号分隔
SQL IN 子句仅返回以逗号分隔的 ID 列表中具有第一个匹配项的行
编写一个sql语句,把b列中的数据用逗号分隔开,变成很多?谢谢