Альтернатива операции UNION при получении данных из одной строки в несколько строк?

Я пытаюсь получить данные из одной строки таблицы в три строки в таблице temp, поэтому я могу обновлять данные на основе значений в другом, и мне интересно, есть ли лучший подход, чем сделать UNION операции.

Вот основной синтаксис UNION, который получает данные из одной строки в три строки, которые я хочу:

(SELECT 
 0 as lead_id,
 'RV' as lead_type,
 '' as lead_serial,
 rv_amplitude as amplitude,
 rv_pulse_width as pulse_width,
 rv_sensitivity as sensitivity
 FROM program_parameters WHERE event_id = 33636)
 UNION
 (SELECT
 0 as lead_id,
 'LV' as lead_type,
 '' as lead_serial,
 final_amplitude as amplitude,
 final_pulse_width as pulse_width.
 final_sensitivity as sensitivity
 FROM program_parameters WHERE event_id = 33636)
 UNION
 (SELECT
 0 as lead_id,
 'ATRIAL' as lead_type,
 atrial_amplitude as amplitude,
 atrial_pulse_width as pulse_width,
 atrial_sensitivity as sensitivity
 FROM program_parameters WHERE event_id = 33636)

так что мои последние данные представляют собой таблицу из трех строк с столбцами.

Единственное ключевое значение, которое я должен получить, это event_id, и в таблице есть только одна строка в event_id.

Есть ли лучший способ получить эти данные в отдельные строки, отличные от операции UNION?

5 ответов

UNION - это правильное решение.

Это то, что вам нужно использовать, когда вы хотите иметь отдельные результирующие наборы как один набор.


Лучшим решением, похоже, является Союз, однако вы можете попробовать использовать переменную таблицы и перекрестное соединение

DECLARE @t TABLE (lead_type VARCHAR(10))
INSERT INTO @t VALUES ('LV')
INSERT INTO @t VALUES ('RV')
INSERT INTO @t VALUES ('ATRIAL')
SELECT 0 as lead_id,
t.lead_type as lead_type,
'' as lead_serial,
CASE t.lead_type 
 WHEN 'LV' THEN rv_amplitude 
 WHEN 'RV' THEN final_amplitude 
 WHEN 'ATRIAL' THEN atrial_amplitude
END as amplitude,
CASE t.lead_type 
 WHEN 'LV' THEN rv_pulse_width
 WHEN 'RV' THEN final_pulse_width
 WHEN 'ATRIAL' THEN atrial_pulse_width
END as pulse_width,
CASE t.lead_type 
 WHEN 'LV' THEN rv_sensitivity
 WHEN 'RV' THEN final_sensitivity
 WHEN 'ATRIAL' THEN atrial_sensitivity
END as sensitivity
FROM program_parameters
CROSS JOIN @t t
WHERE event_id = 33636


Возможно небольшое улучшение:

SELECT 0 as lead_id,
 lead_type,
 '' as lead_serial,
 case lead_type
 when 'RV' then rv_amplitude
 when 'LV' then final_amplitude
 when 'ATRIAL' then atrial_amplitude
 end as amplitude,
 case lead_type
 when 'RV' then rv_pulse_width
 when 'LV' then final_pulse_width
 when 'ATRIAL' then atrial_pulse_width
 end as pulse_width,
 case lead_type
 when 'RV' then rv_sensitivity
 when 'LV' then final_sensitivity
 when 'ATRIAL' then atrial_sensitivity
 end as sensitivity
 FROM (SELECT 'RV' as lead_type union SELECT 'LV' UNION SELECT 'ATRIAL') dummy
 CROSS JOIN program_parameters 
 WHERE event_id = 33636

(Очень похоже на Jhonny's, но с использованием встроенного представления вместо временной таблицы.)


В итоге я немного изменил это, а затем присоединился к второй таблице, чтобы получить серийный номер и другие значения, после добавления lead_area (lead_type из моего исходного вопроса стал столбцом lead_area из-за другого столбца с именем lead_type) во вторую таблицу.

ПРОЦЕДУРА СОЗДАНИЯ usp_IcdLeadProgramming (   @encounterID INT,   @patientID INT ) В ВИДЕ   НАЧАТЬ

-- Create temp table for final results.
CREATE TABLE #tmp(
 lead_area VARCHAR(10), 
 amplitude FLOAT, 
 pulse_width FLOAT, 
 sensitivity FLOAT)
-- Get the values out of the program_parameters table record
INSERT INTO #tmp
SELECT 
 'RV' as lead_area, 
 rv_amplitude as amplitude, 
 rv_pulse_width as pulse_width, 
 rv_sensitivity as sensitivity 
FROM program_parameters 
WHERE event_id = @encounterID 
UNION
SELECT 
 'LV' as lead_area, 
 final_amplitude as amplitude,
 final_pulse_width as pulse_width,
 final_sensitivity as sensitivity
FROM program_parameters 
WHERE event_id = @encounterID
UNION
SELECT 
 'ATRIAL' as lead_area, 
 atrial_amplitude as amplitude,
 atrial_pulse_width as pulse_width,
 atrial_sensitivity as sensitivity
FROM program_parameters 
WHERE event_id = @encounterID
-- Get the current leads and join to the values.
SELECT 
 l.lead_id,
 l.lead_type,
 l.lead_serial, 
 l.lead_system, 
 l.lead_location,
 ll.lead_area,
 t.amplitude,
 t.pulse_width,
 t.sensitivity
FROM 
 leads l
INNER JOIN 
 lead_location_type ll
ON l.lead_location = ll.lead_location_code
INNER JOIN #tmp t
ON ll.lead_area = t.lead_area
WHERE l.patient_id = @patientID 
AND lead_removal_date IS NULL 
AND ll.lead_area IS NOT NULL 
DROP TABLE #tmp
END


Предполагая, что вы имеете в виду временную таблицу в обычном смысле... UNION операции включают в себя разрешение повторяющихся строк. Использование литералов в выражении таблицы означает, что у него не будет повторяющихся строк, поэтому вы можете использовать три отдельных оператора INSERT.

... однако вы можете иметь в виду производную таблицу, CTE и т.д.

licensed under cc by-sa 3.0 with attribution.