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 列表中具有第一个匹配项的行

MS-Access查询以在另一列中收集逗号分隔的结果

编写一个sql语句,把b列中的数据用逗号分隔开,变成很多?谢谢

为啥 Microsoft 的 C/C++ 编译器允许使用逗号分隔表达式的 if 语句? [复制]

数据分析---SQL(Access数据库)