You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过中间表更新News表数据的SQL实现问题求助

解决方案

首先明确:你的需求不是单纯更新现有行,而是要为每个id_title对应的多条Detail记录新增行(仅填充paragraph,其余字段为空),同时更新原行的content和第一个paragraph。原UPDATE语句只能修改现有行,无法实现新增行,且存在字段名错误(detail.title应为detail.id_title)。

一、修改News表(插入新行以匹配期望结果)

步骤1:更新原News行的content字段(关联Title表)

UPDATE news
SET content = title.content
FROM title
WHERE news.id_title = title.id_title;

步骤2:更新原News行的paragraph为对应id_title的第一条Detail记录

UPDATE news n
SET paragraph = d.paragraph
FROM (
    -- 给每个id_title的Detail按id_detail排序,标记第一条
    SELECT id_title, paragraph,
           ROW_NUMBER() OVER (PARTITION BY id_title ORDER BY id_detail) AS rn
    FROM detail
) d
WHERE n.id_title = d.id_title AND d.rn = 1;

步骤3:插入剩余Detail对应的空行(仅填充paragraph)

INSERT INTO news (paragraph)
SELECT d.paragraph
FROM (
    SELECT id_title, paragraph,
           ROW_NUMBER() OVER (PARTITION BY id_title ORDER BY id_detail) AS rn
    FROM detail
) d
JOIN news n ON d.id_title = n.id_title
WHERE d.rn > 1;

执行以上三步后,News表的数据将与你期望的结果一致。

二、仅查询得到期望结果(不修改原表)

如果不需要修改News表,只是想查询出目标格式的结果,可以用以下SQL:

SELECT
    CASE WHEN d.rn = 1 THEN n.number END AS number,
    CASE WHEN d.rn = 1 THEN n.date END AS date,
    CASE WHEN d.rn = 1 THEN n.id_title END AS id_title,
    CASE WHEN d.rn = 1 THEN t.content END AS content,
    d.paragraph
FROM news n
LEFT JOIN title t ON n.id_title = t.id_title
LEFT JOIN (
    SELECT id_title, paragraph,
           ROW_NUMBER() OVER (PARTITION BY id_title ORDER BY id_detail) AS rn
    FROM detail
) d ON n.id_title = d.id_title
-- 补充没有对应Detail的News行
UNION ALL
SELECT n.number, n.date, n.id_title, t.content, n.paragraph
FROM news n
LEFT JOIN title t ON n.id_title = t.id_title
WHERE n.id_title IS NULL
-- 按原number排序,同number的paragraph按顺序排列
ORDER BY 
    COALESCE(n.number, 9999),
    d.rn;

内容的提问来源于stack exchange,提问作者kocebob436

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 06:26:02