2016-03-09 2 views
0

Я не использовал сервер sql в большом сложном масштабе в течение многих лет и искал информацию о том, как правильно задать запрос типа sintax для соединения этих двух наборов данных, а не создавать повторяющиеся имена. У некоторых пациентов будет как заказ, так и клиническое событие, а у некоторых будет только клиническое событие.Запрос Intersect без дубликатов

Набор данных 1

SELECT 
    distinct 
    ea.alias as FIN, 
    per.NAME_Last + ', ' + per.NAME_FIRST + ' ' + Isnull(per.NAME_MIDDLE, '')  as PatientName, 
oa.action_dt_tm as CirOrder, 
od.ORIG_ORDER_DT_TM as DischOrder, 
e.disch_dt_tm as ActualDisch, 
prs.NAME_FULL_FORMATTED as OrderedBy, 
from pathway py 
join encounter e on e.CERNER_ENCOUNTER_ID = py.encntr_id 
join encntr_alias ea on ea.CERNER_ENCNTR_ID = e.CERNER_ENCOUNTER_ID and ea.ENCNTR_ALIAS_TYPE_WCD = 1049 
join person per on per.CERNER_PERSON_ID = e.cerner_PERSON_ID 
join orders o on o.CERNER_ENCNTR_ID= e.CERNER_ENCOUNTER_ID and o.CATALOG_wCD = '82111' -- communication order 
      and o.pathway_catalog_id = '43809296' ---Circumcision Order 
join order_action oa on oa.[CERNER_ORDER_ID] = o.CERNER_ORDER_ID and oa.ACTION_TYPE_WCD = '2494'--ordered 
join orders od on od.CERNER_ENCNTR_ID= e.CERNER_ENCOUNTER_ID and od.CATALOG_WCD = '203520' --- Discharge Patient 
join prsnl prs on prs.CERNER_PERSON_ID = oa.order_provider_id 
where py.pathway_catalog_id = '43809296' and  ---Circumcision Order 
oa.action_dt_tm > '2016-01-01 00:00:00' 
and oa.ACTION_DT_TM < '2016-01-19 23:59:59' 
--use the report prompts as parameters for the action_dt_tm 

Набор данных 2

SELECT 
distinct e.[CERNER_ENCOUNTER_ID], 
ea.alias as FIN, 
per.NAME_Last + ', ' + per.NAME_FIRST + ' ' + Isnull(per.NAME_MIDDLE, '') as PatientName, 
ce.EVENT_END_DT_TM as CircTime, 
od.ORIG_ORDER_DT_TM as DischOrder, 
e.disch_dt_tm as ActualDisch, 
'' OrderedBy, -- should be blank for this set 
cv.DISPLAY 
from encounter e 
join clinical_event ce on e.CERNER_ENCOUNTER_ID = ce.CERNER_ENCNTR_ID 
join encntr_alias ea on ea.CERNER_ENCNTR_ID = e.CERNER_ENCOUNTER_ID and ea.ENCNTR_ALIAS_TYPE_WCD = 1049 
join person per on per.CERNER_PERSON_ID = e.cerner_PERSON_ID 
join orders od on od.CERNER_ENCNTR_ID= e.CERNER_ENCOUNTER_ID and od.CATALOG_WCD = '203520' --- Discharge Patient 
left outer join ENCNTR_LOC_HIST elh on elh.CERNER_ENCNTR_ID = e.CERNER_ENCOUNTER_ID 
left outer join CODE_VALUE cv on cv.CODE_VALUE_WK = elh.LOC_NURSE_UNIT_WCD 
where ce.event_wcd = '201148'  ---Newborn Circumcision 
and ce.[RESULT_VAL] = 'Newborn Circumcision' 
and ce.EVENT_END_DT_TM > '2016-01-01 00:00:00' 
and ce.event_end_dt_tm < '2016-01-19 23:59:59’ 
and ce.RESULT_STATUS_WCD = '25' 
and elh.ACTIVE_STATUS_DT_TM < ce.event_end_dt_tm -- Circ time between the location's active time and end time. 
and elh.END_EFFECTIVE_DT_TM > ce.[EVENT_END_DT_TM] 
--use the report prompts as parameters for the ce.[EVENT_END_DT_TM] 
+0

Ваше название говорит пересекаются, но вы использовали как пересекаются и союзных все теги. Использование как 'intersect', так и' union all' доступно в книгах SQL в Интернете (https://msdn.microsoft.com/en-us/library/ff848745.aspx). Или вы просите что-то еще конкретно? –

+0

Я считаю, что я должен быть больше на линии запроса на пересечение, чтобы получить нужный мне результат. Просто не уверен, как создать синтаксис для запросов выше. – Tony77

+0

В чем проблема? Что вы пробовали? Или вы просто не хотите делать это сами? – Philipp

ответ

0

Структура запроса пересекаются так просто, как:

select statement 1 
intersect 
select statement 2 
intersect 
select statement 3 
... 

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

Вы также можете сделать запрос типа пересечения только с помощью внутренних соединений для фильтрации записей в одном запросе, который не находится в другом. Итак, для простого примера предположим, что у вас есть две таблицы цветов.

Select distinct ColorTable1.Color 
from ColorTable1 
join ColorTable2 
on ColorTable1.Color = ColorTable2.Color 

Это вернет все различные цвета в ColorTable1, которые также в ColorTable2. Использование объединений для фильтрации может помочь вашему запросу работать лучше, но это требует больше внимания.

Также смотрите: Set Operators (Transact-SQL)

+0

Спасибо Брайан. Можете ли вы, пожалуйста, изменить один выше, чтобы он был правильно структурирован? – Tony77

Смежные вопросы