Обновите 1 в 4 логических полях в одной таблице - PullRequest
0 голосов
/ 27 июня 2018

У меня плохо спроектированная таблица, содержащая 4 логических поля, и только одно из этих 4 полей должно быть истинным. ATM Я просто пытаюсь сгенерировать случайные данные для тестирования, но я не могу найти способ произвольно установить одно из четырех полей в true для 10000 строк. Есть ли какой-то чистый способ SQL для этого или я должен использовать некоторый код VBA для этого? База данных, которую я должен использовать, - Microsoft Access.

Спасибо за вашу помощь!

РЕДАКТИРОВАТЬ - на основе ответа Hmax

Private Sub UpdateRandomColumns_Click()
    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    Dim rdm As Integer
    Dim tab(1 To 4) As String

    Set db = CurrentDb
    Set rs = db.OpenRecordset("Data")
    '4 columns that need to randomly be updated per row
    tab(1) = "TimeOut"
    tab(2) = "Interaction"
    tab(3) = "Responses"
    tab(4) = "Manual"

    rs.MoveFirst
    Do Until rs.EOF
        rs.Edit
        rdm = Int((4 - 1 + 1) * Rnd + 1)
        rs(aray(rdm)) = True
        rs.Update
        rs.MoveNext
    Loop
    MsgBox("Update successful")
End Sub

1 Ответ

0 голосов
/ 27 июня 2018

Вы можете использовать в своем UPDATE SQL функцию VBA, например:

Public Function Random1of4(varID As Variant, intIndex As Integer) As Boolean
    Static curID As Variant
    Static intVal As Integer
    If curID <> varID Then
        'new id, generate new random number from 1 to 4
        intVal = Int(Rnd * 4 + 1)
        curID = varID
    End If
    Random1of4 = intIndex = intVal
End Function

Эта функция использует статические переменные, которые хранят значения между вызовами функций. Он внутренне генерирует новое случайное число от 1 до 4 (intVal) и возвращает True, если параметр intIndex равен intVal. Новый intVal генерируется, если параметр varID изменился.
Создайте эту функцию в стандартном модуле, затем создайте и выполните инструкцию UPDATE с этой функцией - передайте varID любое значение из таблицы, которое отличается для каждой строки (обычно первичный ключ), и intIndex - число от 1 до 4 для каждого из логических полей. :

UPDATE Data
SET  TimeOut = Random1of4([ID], 1)
    ,Interaction = Random1of4([ID], 2)
    ,Responses = Random1of4([ID], 3)
    ,Manual = Random1of4([ID], 4);
...