Подзапрос вернул более одного значения при выполнении OPEN JSON JSON_QUERY - PullRequest
0 голосов
/ 06 августа 2020

Я пытаюсь написать запрос к следующей таблице

create table employees (id int identity(1,1) primary key, content nvarchar(max));

insert into employees (content)
values (
N'{
    "name": "John Doe",
    "skills": [
      {
        "language": "SQL",
        "years": 3
      },
      {
        "language": "C#",
        "years": 4
      }
    ]
  }'),

(
N'{
    "name": "Alice Smith",
    "skills": [
      {
        "language": "JS",
        "years": 5
      }
    ]
  }
')
;

Я собираюсь получить следующий результат

+ id + name        + language + years +
|  1 | John Doe    | SQL      |     3 |
|  2 | John Doe    | C#       |     4 |
|  3 | Alice Smith | JS       |     3 |

Вот что я придумал

SELECT * FROM
    OPENJSON(JSON_QUERY((SELECT content FROM employees), '$.skills'))
    WITH (
        Language VARCHAR(50) '$.language',
        Years int '$.years'
    )

Вы можете проверить это в dbfiddle https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=8ed626ed8441ea6ccc62b8feec99c227

Он работает, когда столбец content содержит одну строку, но не работает, когда есть больше.

Subquery returned more than 1 value. This is not permitted when the subquery 
follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

Я понимаю, что это значит, но не могу понять, как добраться до него другим способом.

Я пытался с помощью OPEN JSON и JSON_QUERY

1 Ответ

1 голос
/ 06 августа 2020

Причиной этой ошибки является JSON_QUERY((SELECT content FROM employees), '$.skills') часть инструкции, потому что JSON_QUERY() ожидает строку JSON. Чтобы решить эту ошибку, вы можете попробовать следующий оператор:

SELECT e.id, j1.name, j2.language, j2.years
FROM employees e
OUTER APPLY OPENJSON(e.content) WITH (
   name nvarchar(100) '$.name',
   skills nvarchar(max) '$.skills' AS JSON
) j1
OUTER APPLY OPENJSON(j1.skills) WITH (
   language nvarchar(100) '$.language',
   years int '$.years'
) j2

Результат:

id  name        language    years
1   John Doe    SQL         3
1   John Doe    C#          4
2   Alice Smith JS          5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...