SQLite - 仅设置从连接表返回的正确结果

问题描述 投票:0回答:1

这一切都很新鲜.. 我有两个表(名称简化) 人员表

人员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)

正如我所说,我对此很陌生,所以可能是一个我看不到的非常菜鸟错误。我已经尝试了不同的几个片段来达到这一点

sql sqlite
1个回答
0
投票

使用

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

看到这个样本小提琴

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.