EDIT:Могу ли я сделать этот поиск T-SQL лучше?
Благодаря ответам, я дополнительно очищен код на следующее:
SELECT
AllAlerts.AlertID as AlertID,
Queues.QueueID as QueueID,
Queues.QueueName as QueueName,
AllAlerts.ConnectorID as ConnectorID,
cast(ISNULL(STUFF ((
select cast(',' as varchar(max)) + Services.Label
from (
SELECT distinct Services.Label
from [ISG_SOI ].[dbo].[SecureServiceCI] as Services
inner join [ISG_SOI ].[dbo].[CIRelationship] as Relationship
on Relationship.BNodeCIID = AllAlerts.CIID
where Services.CIID = Relationship.ServiceCIID
) as Services
for xml path ('')
), 1, 1, ''), '') as CHAR(1000)) as OwnedServices,
right(AllAlerts.DeviceID, len(AllAlerts.DeviceID)-charindex(',', AllAlerts.DeviceID)) as CIName,
AllAlerts.DeviceID as DeviceID,
AllAlerts.SituationMessage as Summary,
AllAlerts.AlertDetail as Detail,
AllAlerts.Acknowledged as Acknowledged,
AllAlerts.AssignedTo as AssignedTo,
AllAlerts.ReportedTime as CreatedTime,
AllAlerts.ClearedTime as ClearedTime,
AllAlerts.Severity as Severity,
AllAlerts.SvcDeskTicket as TicketID,
ISNULL(STUFF ((
select cast('# ' as varchar(max)) + Notes.AnnotationText + '[' + Notes.CreatedBy + ', ' + cast(Notes.CreatedTime as varchar(max)) + ']'
from [ISG_SOI ].[dbo].[AlertAnnotation] as Notes
where Notes.AlertID = AllAlerts.AlertID
for xml path('')
), 1, 1, ''), '') as Notes
from
[ISG_SOI ].[dbo].[Alerts] as AllAlerts
inner join [ISG_SOI ].[dbo].[AlertQueueAssignments] as QA
on QA.[AlertID] = AllAlerts.[AlertID]
inner join [ISG_SOI ].[dbo].[AlertQueues] AS Queues
on Queues.[QueueID] = QA.[QueueID]
where Queues.QueueName = 'OCC'
- ОРИГИНАЛЬНЫЙ ПОСТ -
Я работал на T-SQL найдите проект, над которым я работаю на работе, и, наконец, получили параметры поиска, чтобы вернуть все результаты, которые мне нужны. Мне было любопытно, есть ли способ улучшить эту команду? Вам придется простить меня, поскольку я не эксперт по SQL.
SELECT AllAlerts.AlertID AS AlertID
,Queues.QueueID AS QueueID
,Queues.QueueName AS QueueName
,AllAlerts.ConnectorID AS ConnectorID
,CAST(ISNULL(STUFF((SELECT CAST(',' AS VARCHAR(MAX)) + Services.Label
FROM (SELECT DISTINCT Services.Label
FROM [ISG_SOI ].[dbo].[SecureServiceCI] AS Services
WHERE Services.CIID IN (
SELECT Relationship.ServiceCIID
FROM [ISG_SOI ].[dbo].[CIRelationship] AS Relationship
WHERE Relationship.BNodeCIID = AllAlerts.CIID)) AS Services
FOR
XML PATH('')), 1, 1, ''), '') AS CHAR(1000)) AS OwnedServices
,RIGHT(AllAlerts.DeviceID, LEN(AllAlerts.DeviceID) - CHARINDEX(',', AllAlerts.DeviceID)) AS CIName
,AllAlerts.DeviceID AS DeviceID
,AllAlerts.SituationMessage AS Summary
,AllAlerts.AlertDetail AS Detail
,AllAlerts.Acknowledged AS Acknowledged
,AllAlerts.AssignedTo AS AssignedTo
,AllAlerts.ReportedTime AS CreatedTime
,AllAlerts.ClearedTime AS ClearedTime
,AllAlerts.Severity AS Severity
,AllAlerts.SvcDeskTicket AS TicketID
,ISNULL(STUFF((SELECT CAST('# ' AS VARCHAR(MAX)) + Notes.AnnotationText + '[' + Notes.CreatedBy + ', '
+ CAST(Notes.CreatedTime AS VARCHAR(MAX)) + ']'
FROM [ISG_SOI ].[dbo].[AlertAnnotation] AS Notes
WHERE Notes.AlertID = AllAlerts.AlertID
FOR
XML PATH('')), 1, 1, ''), '') AS Notes
FROM [ISG_SOI ].[dbo].[Alerts] AS AllAlerts
,[ISG_SOI ].[dbo].[AlertQueues] AS Queues
WHERE AllAlerts.AlertID IN (SELECT QueueAssignment.AlertID
FROM [ISG_SOI ].[dbo].[AlertQueueAssignments] AS QueueAssignment
WHERE QueueAssignment.QueueID IN (SELECT Queues.QueueID
WHERE Queues.QueueName = 'OCC'))
Я удалил тег MySQL, потому что это явно о SQL Server. –
Вам не задан последний оператор 'FROM'. –
Почти гарантировано, что это можно было бы переписать лучше. Вы используете подзапросы как сумасшедшие, хотя кажется, что по крайней мере предложение where может быть легко переписано с помощью простого внутреннего соединения, что должно значительно повысить производительность. Как правило, подзапросы стоят дорого, вы почти всегда хотите заменить их на объединения, если это возможно. – Luaan