如何用随机序列中的B值更新A表中的空白字段

时间:2019-06-22 02:28:24

标签: sql ms-access

我面临着一个巨大的问题!我是希腊雅典中央警察局的警务人员,我正在尝试创建一个数据库,该数据库每天自动为约200 -300名警务人员创建工作时间表。 我创建了3个表:
 A)包含300名军官及其ID的所有信息的表(作为与表C“连接的主键),以及其他信息(例如地址),当他们转移给我们时,将其命名为“表A”
 B)一张桌子,上面有官员可能需要的所有可能的地方  例如,列A [NOT THE HEADER]中的记录为“ Police patrols”,列B:“我们将为该服务提供服务的人数”,为此我创建了一个查询(带有统计表,因此它可以重复许多记录如我所愿,例如,如果我需要30个人巡逻,它将在表C中创建此服务的30条唯一记录,并且我已经为日期设置了输入,因此它可以在表C中自动输入日期。 />  C)表C:这里我有信息,例如由查询创建的带有工作时间的所有服务,以及将分配给特定地点的人员ID的列。

现在,我被困在尝试以随机顺序更新表C,特别是ID号列,以及表A中所有警察的ID号列。(我还没有到达随机部分但是,每次我更新表C时,它只会从表A的第一条记录中获取ID,而忽略了所有其他记录,因此它将相同的ID号放入我需要的30个位置,并且不会显示来自表A)

WHERE (((TableC.DateofDuty)=[Date]));

我很幸运,因为表C中的每条记录都从表A获得了相同的ID。

我也尝试过这个:

UPDATE TableC LEFT OUTER JOIN TableA ON TableC.ID= TableA.ID
 SET TableC.ID = TableA.ID
WHERE (((TableC.DateofDuty)=[Date]));
UPDATE TableC SET TableC.ID= TableA.ID
WHERE (((TableC.DateofDuty)=[Date]));

UPDATE TableC LEFT OUTER JOIN TableA ON TableC.ID= TableA.ID
 SET TableC.ID = TableA.ID
WHERE (((TableC.DateofDuty)=[Date]));

在第一行代码中,它更新了所有我想更新但具有相同ID的记录。在第二条记录中,它询问我是否要填充特定的地方(比如说100个我想要的地方),我按“是”并且没有ID更新。

我也尝试过内部连接,但没有运气

非常感谢您的帮助

编辑:我刚刚注意到我的邮件被标记为不足,所以 我会再说一些细节

这是需要填充/更新的表: 表C

 Service Duty      Date              ID
ΜΕΤΑΓΩΓΕΣ        24/06/2019 
ΜΕΤΑΓΩΓΕΣ        24/06/2019 
ΜΕΤΑΓΩΓΕΣ        24/06/2019 

从表A

 (Primary ID)   Police Rank
250311           ΤΑΞΙΑΡΧΟΣ
288066           ΑΡΧΙΦΥΛΑΚΑΣ
288076           ΑΣΤΥΦΥΛΑΚΑΣ

到目前为止,我已经使用了以下代码

UPDATE [TABLE C] INNER JOIN [TABLE A] ON  [[TABLE C].ID =  [TABLE A].ID
SET [TABLE C].ID= [TABLE A].ID
WHERE ((([TABLE A].DATE)=[INPUT DATE]));

哪怕我在输入中输入正确的日期也更新0行(24/06/2019) 我什至把1/1/2019只是为了确保它不是引起问题的输入

第二次尝试:

UPDATE [TABLE C] Left JOIN [TABLE A] ON  [[TABLE C].ID =  [TABLE A].ID
SET [TABLE C].ID= [TABLE A].ID
WHERE ((([TABLE A].DATE)=[INPUT DATE]));

这提示我更新所有3条记录,但什么也不更新,因此即使它说它要更新,也不会更新。

第三次尝试

UPDATE [TABLE C] Right JOIN [TABLE A] ON  [[TABLE C].ID =  [TABLE A].ID
SET [TABLE C].ID= [TABLE A].ID
WHERE ((([TABLE A].DATE)=[INPUT DATE]));

但是它返回0条记录...

第4次尝试  我只有表C

UPDATE [TABLE C] SET [TABLE C].ID= "Random Text"
WHERE ((([TABLE C].Date)=[input date]));

将输入到我输入的日期的ID更新为“ Random Text” 但是,一旦我将Table A重新放回游戏中,它就会返回0值

只要我弄清楚,我就会继续尝试。我确信这一定是我真的很想念的东西。

2 个答案:

答案 0 :(得分:0)

您可以使用我的功能:

' Builds random row numbers in a select, append, or create query
' with the option of a initial automatic reset.
'
' 2018-09-11. Gustav Brock, Cactus Data ApS, CPH.
'
Public Function RandomRowNumber( _
    ByVal Key As String, _
    Optional Reset As Boolean) _
    As Single
    ' Error codes.
    ' This key is already associated with an element of this collection.
    Const KeyIsInUse        As Long = 457

    Static Keys             As New Collection

    On Error GoTo Err_RandomRowNumber

    If Reset = True Then
        Set Keys = Nothing
    Else
        Keys.Add Rnd(-Timer * Keys.Count), Key
    End If

    RandomRowNumber = Keys(Key)

Exit_RandomRowNumber:
    Exit Function

Err_RandomRowNumber:
    Select Case Err
        Case KeyIsInUse
            ' Key is present.
            Resume Next
        Case Else
            ' Some other error.
            Resume Exit_RandomRowNumber
    End Select
End Function

在这样的查询中:

SELECT
    ID,
    [Order ID],
    [Unit Price],
    RandomRowNumber(CStr([ID])) AS RandowRow
FROM
    [Order Details]
ORDER BY
    RandomRowNumber(CStr([ID]));

在我的文章Random Rows in Microsoft Access中对此进行了解释。

如果您没有帐户,请浏览链接:阅读全文。

代码也在 GitHub 上:VBA.RowNumbers

答案 1 :(得分:0)

所以我有点想通了 让我真的快速回顾一下 我们有:

TABLEA
ID      | POLICE RANK | FULL NAME   |
____________________________________
288066  |  Const.     | Chris Meli  |
273111  |  Serg.      | John  Do    |
231444  |  Const.     | Bill  Park  |
298432  |  Const.     | Joe   Park  |
_____________________________________

包含警务人员的信息,并连接到 TableC 中的 ID 字段,因此,即使从TableA上的连接,您也可以检查每名警官的职责分配给前几天。

TABLEB

DUTY    | Number of Police needed   |
        | for each service          |
____________________________________
Patrol  |             1             |
Guards  |             1             |
Courts  |             2             |
____________________________________

为简单起见,我将数字1和2放在数字中。通常, TableA 将容纳超过250人,并且在 TableB 上将有许多 Duty ,并且需要的警察数量将取决于日期和许多其他因素。

TABLEC
ID      | DUTY        | DATE        |
____________________________________
        |             |             |
        |             |             |
        |             |             |
        |             |             |
_____________________________________

TableC将由TableA(ID),TableB(Duty)填充,并且输入日期i将通过以下附加查询进行调度

INSERT INTO TABLEC ( DUTY, DATE, ID )
SELECT TABLEB.DUTY, [INPUT DATE], TABLEA.ID
FROM TABLEA, TABLEB INNER JOIN n ON n.n <= TABLEB.[Number of Police needed for each service];

(n是一个数字表,n.n是一个具有10000个数字的列,因此请不要注意) 现在,附加查询向我返回了我需要的结果,但是发生的是,该类型乘上所需的职位与该人员的ID。 所以不要这样:

TABLEC
ID      | DUTY        | DATE        |
____________________________________
288066  |  Patrol     | 23/06/2019  |
273111  |  Guards     | 23/06/2019  |
231444  |  Courts     | 23/06/2019  |
298432  |  Courts     | 23/06/2019  |
_____________________________________

我有这个

TABLEC
ID      | DUTY        | DATE        |
____________________________________
288066  |  Patrol     | 23/06/2019  |
288066  |  Guards     | 23/06/2019  |
288066  |  Courts     | 23/06/2019  |
288066  |  Courts     | 23/06/2019  |
273111  |  Patrol     | 23/06/2019  |
273111  |  Guards     | 23/06/2019  |
273111  |  Courts     | 23/06/2019  |
273111  |  Courts     | 23/06/2019  |
231444  |  Patrol     | 23/06/2019  |
231444  |  Guards     | 23/06/2019  |
231444  |  Courts     | 23/06/2019  |
231444  |  Courts     | 23/06/2019  |
298432  |  Patrol     | 23/06/2019  |
298432  |  Guards     | 23/06/2019  |
298432  |  Courts     | 23/06/2019  |
298432  |  Courts     | 23/06/2019  |
_____________________________________

有没有一种方法可以自动连接TableA.ID和TableB.DUTY?