访问 2013,想确保我的 SQL 正在做我想做的事
Access 2013, want to make sure my SQL is doing what I think it is
我的理解是下面的SQL是:
(1) 从tbl1取数据更新tbl2
(2) 添加新记录和更新旧记录。
(3) 覆盖 tbl2 中的现有数据
(4) 不要用空白单元格覆盖 tbl2 中的数据
我在这个问题上是否偏离了目标?如果是,怎么办?
UPDATE tbl1
INNER JOIN tbl2
ON tbl1.thing0 = tbl2.thing0
SET tbl2.[thing1] = tbl1.[thing1], tbl2.[thing2] = tbl1.[thing2], tbl2.[thing3] = tbl1.[thing3];
编辑1
所以为了满足条件 2 和 4 并让用户轻松使用:
(2) 使用 APPEND 查询添加新的数据行,UPDATE 只会更改现有的行。
(4) 使用更新查询,如何防止它用空白单元格覆盖现有行中的数据?
我有用户在现场实时更新 table,我担心远程用户在建立连接后更新 table 会用一堆更新覆盖现场用户数据空白单元格。
这样的东西能满足条件4吗?
UPDATE tbl1
INNER JOIN tbl2
ON tbl1.thing0 = tbl2.thing0
SET tbl2.[thing1] = tbl1.[thing1], tbl2.[thing2] = tbl1.[thing2], tbl2.[thing3] = tbl1.[thing3]
WHERE Not Null:
(5) 然后将宏附加到命令按钮,以便用户可以 运行 同时查询。
- 是
- no - UPDATE 不添加记录;您的查询更新了 tbl2 中的所有记录,其中可以找到 tbl1 中的相应记录
- 是
- 否 - 如果 tbl1 中对应的 row/record 有 empty/blank 字段,那么无论如何这些都会被写入 tbl2
OP 编辑后,Re #4:
您可以在 SET 行上使用 Iif(),如下所示(也许您应该添加 Trim() 或检查 NULL 值或类似值):
SET tbl2.[thing1] = Iif(tbl1.[thing1] = '', tbl2.[thing1], tbl1.[thing1])
Iif() 是 MS Access 函数;在正确的 SQL 你必须使用 Case 语句。
我的理解是下面的SQL是:
(1) 从tbl1取数据更新tbl2
(2) 添加新记录和更新旧记录。
(3) 覆盖 tbl2 中的现有数据
(4) 不要用空白单元格覆盖 tbl2 中的数据
我在这个问题上是否偏离了目标?如果是,怎么办?
UPDATE tbl1
INNER JOIN tbl2
ON tbl1.thing0 = tbl2.thing0
SET tbl2.[thing1] = tbl1.[thing1], tbl2.[thing2] = tbl1.[thing2], tbl2.[thing3] = tbl1.[thing3];
编辑1
所以为了满足条件 2 和 4 并让用户轻松使用:
(2) 使用 APPEND 查询添加新的数据行,UPDATE 只会更改现有的行。
(4) 使用更新查询,如何防止它用空白单元格覆盖现有行中的数据?
我有用户在现场实时更新 table,我担心远程用户在建立连接后更新 table 会用一堆更新覆盖现场用户数据空白单元格。
这样的东西能满足条件4吗?
UPDATE tbl1
INNER JOIN tbl2
ON tbl1.thing0 = tbl2.thing0
SET tbl2.[thing1] = tbl1.[thing1], tbl2.[thing2] = tbl1.[thing2], tbl2.[thing3] = tbl1.[thing3]
WHERE Not Null:
(5) 然后将宏附加到命令按钮,以便用户可以 运行 同时查询。
- 是
- no - UPDATE 不添加记录;您的查询更新了 tbl2 中的所有记录,其中可以找到 tbl1 中的相应记录
- 是
- 否 - 如果 tbl1 中对应的 row/record 有 empty/blank 字段,那么无论如何这些都会被写入 tbl2
OP 编辑后,Re #4:
您可以在 SET 行上使用 Iif(),如下所示(也许您应该添加 Trim() 或检查 NULL 值或类似值):
SET tbl2.[thing1] = Iif(tbl1.[thing1] = '', tbl2.[thing1], tbl1.[thing1])
Iif() 是 MS Access 函数;在正确的 SQL 你必须使用 Case 语句。