Использование оператора CASE
, как это сделали jms или Russ, возможно, гораздо лучший способ, но вы также можете использовать подвыборы для решения проблемы:
SELECT ti.TicketID,
pp.FirstName || ' ' || pp.LastName AS RequesterFullName,
(SELECT ta.AttributeValue FROM tblTicketAttribute AS ta WHERE ta.Attribute = 'Urgent' AND ta.TicketID = ti.TicketID) AS UrgentPriorityID,
(SELECT ta.AttributeValue FROM tblTicketAttribute AS ta WHERE ta.Attribute = 'Medium' AND ta.TicketID = ti.TicketID) AS MediumPriorityID,
(SELECT ta.AttributeValue FROM tblTicketAttribute AS ta WHERE ta.Attribute = 'Low' AND ta.TicketID = ti.TicketID) AS LowPriorityID
FROM tblTicketIssues AS ti
INNER JOIN tblPersonnelProfile AS pp ON ti.RequestorID = pp.PersonnelID;
Я подозреваю, что CASE
будет намного быстрее, но вы никогда не узнаете, пока не проведете измерения, и иногда подход с дополнительным выбором является вашим единственным вариантом. Вы автоматически получите значения NULL в столбцах дополнительного выбора, если предикат WHERE
равен false.
Кроме того, вы можете увидеть совершенно другой способ форматирования запросов SQL, а также более сложный оператор конкатенации Oracle-ish.
Я должен также упомянуть, что дополнительный выбор не будет работать, если столбец TicketID в tblTicketAttribute не уникален, но другие варианты также могут дать странные результаты, если это так.