这一切都很新鲜.. 我有两个表(名称简化) 人员表
人员ID | 名称前缀 | 名称后缀 |
---|---|---|
1 | 空 | 空 |
2 | 空 | 空 |
3 | 先生 | 无 |
4 | 空 | 空 |
事实表
事实类型 | 所有者ID | 事实详情 |
---|---|---|
24 | 3 | (无关) |
42 | 2 | 队长 |
42 | 3 | 尊敬的。 |
36 | 3 | 某处之主 |
显然我需要运行 2 个单独的 UPDATE 查询 一是更新 NamePrefix,其中 FactType = 42,并且 一个更新 NameSuffix,其中 FactType = 36
事实表中的每个 PersonID 可能没有、有一个或多个条目,但通常每种事实类型只有一个(除非数据中某处出现错误 - 目前我并不担心)
我尝试了什么 我正在跑步
UPDATE PersonTable
SET NamePrefix = Trim( PersonTable.NamePrefix || " " ||
(
SELECT FactTable.FactDetails
FROM PersonTable
INNER JOIN FactTable
ON PersonTable.PersonID = FactTable.OwnerID
WHERE FactTable.FactType='42'
AND FactTable.OwnerID = PersonTable.OwnerID
)
);
第一次运行后我期望在表中看到什么(事实类型='42')
人员ID | 名称前缀 | 名称后缀 |
---|---|---|
2 | 队长 | 空 |
3 | 尊敬的先生 | 空 |
以及我期望在运行第二次运行后在表中看到的内容(事实类型='36')
人员ID | 名称前缀 | 名称后缀 |
---|---|---|
2 | 队长 | 空 |
3 | 尊敬的先生 | 某处之主 |
然而 我得到的结果是,人员表的所有实例都由事实表中的第一个匹配记录(= 42)填充,因此每个人都有一个 CAPT 前缀,无论他们在事实表中是否有任何条目。
但是,当我仅运行“选择部分”时,
SELECT PersonTable.OwnerID, FactTable.FactDetails --(I need that extra first field in there to check the right person)
FROM PersonTable
INNER JOIN FactTable
ON PersonTable.PersonID = FactTable.OwnerID
WHERE FactTable.FactType='42'
AND FactTable.OwnerID = PersonTable.OwnerID
我只获得了 PersonTable 中那些具有相应事实、类型正确的人员的正确列表 (42)
正如我所说,我对此很陌生,所以可能是一个我看不到的非常菜鸟错误。我已经尝试了不同的几个片段来达到这一点
使用
UPDATE FROM
语法比使用子查询更简单。
在WHERE
子句中,可以设置所有必要的条件。
就您而言,您说
PersonTable.PersonID = Fact.OwnerID
并检查 FactType
。
因此,第一个更新命令将是:
UPDATE PersonTable
SET NamePrefix = TRIM(COALESCE(PersonTable.NamePrefix, '') || ' ' || Fact.FactDetail)
FROM (SELECT FactDetail, OwnerID, FactType FROM FactTable) AS Fact
WHERE
PersonTable.PersonID = Fact.OwnerID
AND Fact.FactType = 42;
第二个:
UPDATE PersonTable
SET NameSuffix = Fact.FactDetail || ' ' || TRIM(COALESCE(PersonTable.NameSuffix, ''))
FROM (SELECT FactDetail, OwnerID, FactType FROM FactTable) AS Fact
WHERE
PersonTable.PersonID = Fact.OwnerID
AND Fact.FactType = 36;
注意:我在
COALESCE
周围添加了 PersonTable.NamePrefix
,否则,如果之前已经是 NULL
,它将保留 NULL
。
运行两个更新命令后,人员表将如下所示:
人员ID | 名称前缀 | 名称后缀 |
---|---|---|
1 | 空 | 空 |
2 | 队长 | 空 |
3 | 尊敬的阁下。 | 某处之主 |
4 | 空 | 空 |
看到这个样本小提琴