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

SQL导入JSON数据到Directors表:如何仅插入拍过恐怖电影的导演

正确实现SQL语句

INSERT INTO Directors (Id, Name)
SELECT DISTINCT d.Id, d.Name
FROM OPENJSON(@DIRECTORS, '$')
     WITH (
        Id INT  '$.Id',
        Name VARCHAR(MAX) '$.Name'
     ) AS d
INNER JOIN Movie m 
    ON d.Name = m.DirectorName
WHERE m.Genre = 'Horror'

语法错误原因说明

之前写法的错误是把别名d写在了OPENJSON(...)后面、WITH子句前面,WITH子句是用来定义JSON解析后输出的列结构,别名必须放在WITH子句的末尾。

补充优化说明

  • 加DISTINCT是为了避免同一个导演拍了多部恐怖片时,重复插入同一条导演数据到Directors表中,也可以替换为EXISTS写法,逻辑等价且性能更优:
INSERT INTO Directors (Id, Name)
SELECT d.Id, d.Name
FROM OPENJSON(@DIRECTORS, '$')
     WITH (
        Id INT  '$.Id',
        Name VARCHAR(MAX) '$.Name'
     ) AS d
WHERE EXISTS (
    SELECT 1 FROM Movie m 
    WHERE m.DirectorName = d.Name 
    AND m.Genre = 'Horror'
)
  • 如果Directors表已有存量数据,建议额外增加主键冲突判断,避免插入报错:
INSERT INTO Directors (Id, Name)
SELECT d.Id, d.Name
FROM OPENJSON(@DIRECTORS, '$')
     WITH (
        Id INT  '$.Id',
        Name VARCHAR(MAX) '$.Name'
     ) AS d
WHERE EXISTS (
    SELECT 1 FROM Movie m 
    WHERE m.DirectorName = d.Name 
    AND m.Genre = 'Horror'
)
AND NOT EXISTS (
    SELECT 1 FROM Directors dir 
    WHERE dir.Id = d.Id
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 07:36:08