我有一个选择查询,它执行一些文本操作以基本上重新格式化一个字段,以便我可以在另一个表中查找它:
如果我的第一个表有一个像“J1/2”这样的字段,它会在不同的表中查找记录的 ID,其中 J1 和 J2 在相应的字段中。
这一切都很好。
现在我想更新原始表,因此我不必再使用此字符串操作进行查找,但我对更新查询的尝试以“操作必须使用可更新查询”结尾
有任何想法吗?
我的 SELECT 语句:
SELECT DISTINCT
t1.DD,
t1.TN,
t1.DD & " J" & MID(t1.TN,2,1) AS CalculatedStart,
t1.DD & " J" & MID(t1.TN,4,1) AS CalculatedEnd,
t2.ID
FROM t1 INNER JOIN t2
ON (t1.DD & " J" & MID(t1.TN,2,1)=t2.StartLink)
AND (t1.DD & " J" & MID(t1.TN,4,1)=t2.EndLink)
WHERE t1.TN Like "J?/?"
AND t1.DD Like "M*";
回想一下——这很好用,我从另一端得到了必要的 t2.ID。
所以我想做类似的事情:
UPDATE t1 SET t2ID = (
SELECT Query1.ID
FROM Query1
WHERE t1.DD=Query1.DD
AND t1.TN=Query1.TN
)
WHERE t1.TN Like "J?/?"
AND t1.DD Like "M*";
只有这个失败。这是在 MS Access 本身内,所以我无法想象像大多数“操作必须使用可更新查询”问题那样的实际权限问题。
编辑:试图简化不起作用的情况。
这个 UPDATE 查询很好:
UPDATE t1
SET t2ID="Unknown"
WHERE TN LIKE "J?/?"
AND DD LIKE "M*";
这个失败了(感谢 Goedke——这个例子显然失败了,因为子查询返回了 1 个以上的结果。我过于简单地试图找到我的问题)
UPDATE t1
SET t2ID=(SELECT ID FROM t2)
WHERE TN LIKE "J?/?"
AND DD LIKE "M*";
那么我只是在某种程度上让我的子查询语法错误吗?
编辑:这个 SELECT 语句也很好:
SELECT t1.OA, t1.DD, t1.TN, t1.HATRIS,
query1.DD, query1.TN, query1.ID
FROM t1 INNER JOIN query1
ON t1.DD=query1.DD
AND t1.TN=query1.TN
此外,在上面的 select 语句中使用 count 表明每个 (DD,TN) 组合恰好返回 1 个 ID
编辑:
我现在要做的最简单的情况——使用各种 SELECT 语句,我现在有一个只有 2 列的表——t1 的主键和我想要插入到 t1 中的值。
好像还是写不出来
UPDATE t1 SET t1.f2 = (SELECT t2.f2 FROM t2 WHERE t2.f1 = t1.f1)
其中 t1 的主键是 f1。即使添加 WHERE t1.f1 IN (SELECT f1 FROM t2) 也无济于事。(添加以消除子查询返回0结果的可能性)