【问题标题】:How to make sql sub-query in OPENJSON function?如何在 OPENJSON 函数中进行 sql 子查询?
【发布时间】:2019-07-15 16:04:27
【问题描述】:

我正在使用 openjson 函数将 json 数据导入关系表。它包含字段应导入到子表。如何在 OPENJSON WITH 子句中进行子查询?

数据库有两个表 CourtSession 和 LigitigationType。 CourtSession 表对 LigitigationType 表有参考 (LigitigationTypeId - Id)。数据库图是

导入json数据的sql:

DECLARE @json NVARCHAR(MAX)
SET @json = 
N'[
    {
        "date": "11.07.2019 09:00",
        "judge": " Novik V.P",
        "forma": "Criminal proceedings",
        "number": "759/9893/18",
        "involved": "The accused: Deaf Anatoly",
        "description": "Theft",
        "add_address": "01032, Kyiv, Kyiv, street. Zhilyanskaya, 142",
        "courtroom": ""
    },
]'

INSERT INTO CourtSession
SELECT jsonData.*
FROM OPENJSON(@json, N'$.CourtSessions')
        WITH (
           CourtDate DATETIME2 N'$.date',
           Judge NVARCHAR(100) N'$.judge',
           LigitigationTypeId INT (SELECT Id FROM LigitigationType Where JSON_VALUE(@json, '$.forma') = Name),
           CourtNumber NVARCHAR(100) N'$.number',
           Involved NVARCHAR(MAX) N'$.involved',
           Description NVARCHAR(MAX) N'$.description',
           Address NVARCHAR(300) N'$.add_address',
           CourtRoom NVARCHAR(100) N'$.courtroom'
        ) 
AS jsonData

我希望子查询通过 WITH 子句中的谓词“JSON_VALUE(@json, '$.forma') = Name”找到 LigitigationTypeId,但 sql-server 返回错误“'SELECT' 附近的语法不正确。”

【问题讨论】:

  • 你不能在你的WITH 里面放一个子查询。您需要在FROMSELECT 之外进行。

标签: json sql-server tsql


【解决方案1】:

您似乎需要执行JOIN。然而,无法测试,它似乎应该简单到:

INSERT INTO dbo.CourtSession --({Column List Goes here})
SELECT JD.CourtDate,
       JD.Judge,
       LT.ID,
       JD.CourtNumber,
       JD.Involved,
       JD.[Description],
       JD.[Address],
       JD.CourtRoom
FROM OPENJSON(@json, N'$.CourtSessions')
        WITH (CourtDate datetime2 N'$.date',
              Judge nvarchar(100) N'$.judge',
              Forma nvarchar(100) N'$.forma',
              CourtNumber nvarchar(100) N'$.number',
              Involved nvarchar(MAX) N'$.involved',
              [Description] nvarchar(MAX) N'$.description',
              [Address] nvarchar(300) N'$.add_address',
              CourtRoom nvarchar(100) N'$.courtroom') JD
    JOIN dbo.LigitigationType LT ON JD.Forma = LT.[Name];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-03
    • 1970-01-01
    相关资源
    最近更新 更多