Я использую сервер Microsoft SQL v14.0.1000. Я использую приведенный ниже запрос для преобразования результата моего запроса в JSON:
SELECT TOP(5) dn.id AS ID,
dn.EventTimeStamp AS EventTimeStamp,
dn.ControllerId AS ControllerID,
JSON_QUERY((SELECT ControllerName
FROM Controllers
WHERE dn.ControllerId = Controllers.ControllerID
FOR JSON PATH, without_array_wrapper)) AS ControllerName
FROM DashboardNotifications dn
ORDER BY dn.ID DESC
FOR JSON PATH
И в результате получаем следующий JSON:
[
{
"ID": 354,
"EventTimeStamp": "2022-05-17T05:35:25",
"ControllerId": 24,
"ControllerName": {
"ControllerName": "P25-SC-0233"
}
},
{
"ID": 353,
"EventTimeStamp": "2022-05-17T05:34:20",
"ControllerId": 17,
"ControllerName": {
"ControllerName": "P25-SC-0226"
}
},
{
"ID": 352,
"EventTimeStamp": "2022-05-17T05:33:50",
"ControllerId": 16,
"ControllerName": {
"ControllerName": "P25-SC-0225"
}
}
]
Я смог удалить квадратные скобки из
"ControllerName":[{"ControllerName":"P25-SC-0233"}],
хотя мой желаемый результат:
[
{
"ID": 354,
"EventTimeStamp": "2022-05-17T05:35:25",
"ControllerId": 24,
"ControllerName": "P25-SC-0233"
},
{
"ID": 353,
"EventTimeStamp": "2022-05-17T05:34:20",
"ControllerId": 17,
"ControllerName": "P25-SC-0226"
},
{
"ID": 352,
"EventTimeStamp": "2022-05-17T05:33:50",
"ControllerId": 16,
"ControllerName": "P25-SC-0225"
}
]
Какие изменения мне нужно внести, чтобы удалить вложенный ключ ControllerName?
@Salman Удаление json_query фактически даст "ControllerName":"{\"ControllerName\":\"P25-SC-0233\"}"
Трудно сказать без схемы таблицы, но кажется, что вы должны присоединяться к контроллерам, а не оборачивать их в подзапрос.
@AlwaysLearning Клянусь, это не сработало, когда я пытался присоединиться ранее, лол.... Сейчас это работает, может быть, на этот раз я внес некоторые изменения. Спасибо, что заставил меня попробовать присоединиться еще раз :D
удалите json_query
И for json
внутри подзапроса. Или, возможно, использовать боковое соединение. К сожалению, вы не предоставили работающий пример, иначе было бы проще.
Я думаю, вам просто нужен подзапрос без FOR JSON
(и тогда вам не нужно JSON_QUERY
, чтобы избежать его)
SELECT TOP(5) dn.id AS ID,
dn.EventTimeStamp AS EventTimeStamp,
dn.ControllerId AS ControllerID,
(
SELECT c.ControllerName
FROM Controllers c
WHERE dn.ControllerId = c.ControllerID
) AS ControllerName
FROM DashboardNotifications dn
ORDER BY dn.ID DESC
FOR JSON PATH;
Ensure your subquery is guaranteed to return a maximum of one row
Вы также можете просто использовать соединение
SELECT TOP(5) dn.id AS ID,
dn.EventTimeStamp,
dn.ControllerId,
c.ControllerName
FROM DashboardNotifications dn
LEFT JOIN
Controllers c ON dn.ControllerId = c.ControllerID
ORDER BY dn.ID DESC
FOR JSON PATH;
Это то, что мне нужно. Хотя я пробовал что-то похожее на оба этих подхода, прежде чем использовать json_query. Должно быть, совершил какую-то глупую ошибку. Забавно, теперь я не могу воспроизвести ошибку, которую я сделал.
Теперь возникла проблема, я фактически использовал For JSON AUTO
в конце ранее вместо JSON PATH, запрос был точно таким же, как ваш запрос на соединение.
Совершенно не обязательно json_query
. Измените запрос на:
SELECT TOP(5) dn.id AS ID, dn.EventTimeStamp AS EventTimeStamp, dn.ControllerId AS ControllerID, (
SELECT ControllerName FROM Controllers WHERE dn.ControllerId = Controllers.ControllerID
) AS ControllerName
FROM DashboardNotifications dn
ORDER BY dn.ID DESC
FOR JSON PATH
Просто удалите json_query, нет?