Access преобразовать многозначную таблицу полей - PullRequest
0 голосов
/ 27 ноября 2018

Я взял базу данных, в которой есть таблица с многозначными полями, например

Current multi valued field example

Я пытаюсь преобразовать это в таблицу однозначных полей, например

Desired single value field table

Число в обеих таблицах - просто ID, которое относится к человеку по имени Contact_ID.

Я пытался сделать это как в Access с использованием перекрестных запросов, так и в Excel с транспонированием, однако я не могу создать новую таблицу с несколькими примерами одного и того же Contact_ID в одном столбце и уникальными ключевыми словами во втором.

Ценю любые предложения о том, как лучше всего это сделать.

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

Значения в вашем многозначном поле будут получены из таблицы в вашей базе данных.

Чтобы вернуть отдельные элементы, вам нужно добавить .Value в поле запроса.

Например,

Если Table1 содержит ID в качестве AutoNumber и MyLookUpItems в качестве отдельных элементов.

| MyLookUpID | MyLookUpField |
|------------|---------------|
| 1          | Alcohol       |
| 2          | Smoking       |
| 3          | diet          |
| 4          | Nutrition     |

Table2 содержит MyMultiValueField, показывая несколько значений.

| MyMultiValueField |
|-------------------|
| Smoking, diet     |
| Alcohol, diet     |

Чтобы вернуть отдельные элементы, которые вы использовали бы:

SELECT MyMultiValueField.Value
FROM   Table2  

Это вернет:

| MyMultiValueField.Value |
|-------------------------|
| diet                    |
| Smoking                 |
| Alcohol                 |
| diet                    |

Затем вы можете вернуться к исходному идентификатору:

SELECT MyLookUpID, MyLookUpField
FROM Table2 INNER JOIN Table1 ON Table2.MyMultiValueField.Value = Table1.MyLookUpID  

, который будет возвращаться:

| MyLookUpID | MyLookUpField |
|------------|---------------|
| 1          | Alcohol       |
| 2          | Smoking       |
| 3          | diet          |  

Если вы не уверены, какой источник для многозначных полей, откройте таблицу в режиме конструктора и посмотрите на Lookupвкладка для поля.
Row Source будет выглядеть примерно так:

SELECT [Table1].[MyLookUpID], [Table1].[MyLookUpField] FROM Table1 ORDER BY [MyLookUpField]; 

Показывает, что Table1 является источником.

Редактировать:
Теперь , написав все это .... просто посмотрите на схему таблицы и таблицы в источнике строк это таблица полей с одним значением, которую вы искали в своем вопросе.

0 голосов
/ 27 ноября 2018

При неизвестном количестве строк, разделенных запятыми, вероятно, проще всего перебрать таблицу с использованием набора записей, использовать функцию Split для разделения элементов и заполнить другой набор записей, например:

Function ConvertTable()
    Dim strOldTable As String: strOldTable = "Table1"
    Dim strNewTable As String: strNewTable = strOldTable & "_new"

    Dim dbs As DAO.Database
    Dim rst1 As DAO.Recordset
    Dim rst2 As DAO.Recordset
    Dim lngCID As Long
    Dim itm

    Set dbs = CurrentDb

    DoCmd.CopyObject , strNewTable, acTablem, strOldTable
    dbs.Execute "delete from [" & strNewTable & "]"

    Set rst1 = dbs.OpenRecordset(strOldTable)
    Set rst2 = dbs.OpenRecordset(strNewTable)
    If Not rst1.EOF Then
        rst1.MoveFirst
        Do Until rst1.EOF
            lngCID = rst1!Contact_ID
            For Each itm In Split(rst1!Field1, ",")
                If Trim(itm) <> "*" Then
                    rst2.AddNew
                    rst2!Contact_ID = lngCID
                    rst2!Field1 = Trim(itm)
                    rst2.Update
                End If
            Next itm
            rst1.MoveNext
        Loop
    End If
    rst1.Close
    rst2.Close
    Set rst1 = Nothing
    Set rst2 = Nothing
    Set dbs = Nothing
End Function
...