2016-03-09 2 views
0

Je n'ai pas utilisé SQL Server dans une grande échelle complexe depuis des années, et la recherche d'aide sur la façon correcte de sintax intersecter type de requête à joing ces deux ensembles de données, et ne pas créer des noms en double. Certains patients recevront une commande et une entrée à un événement clinique et d'autres n'auront qu'un événement clinique.Intersect requête sans doublons

Data Set 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 

Data Set 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

Votre titre dit Intersection mais vous avez utilisé à la fois l'Intersect et union-tous les tags. L'utilisation de 'intersect' et' union all' est dans les livres SQL en ligne (https://msdn.microsoft.com/fr-fr/library/ff848745.aspx). Ou demandez-vous autre chose spécifiquement? –

+0

Je crois que je devrais être plus sur les lignes d'une requête d'intersection pour obtenir la sortie dont j'ai besoin. Ne sais pas comment créer la syntaxe pour les requêtes ci-dessus. – Tony77

+0

Quel est le problème? Qu'avez-vous essayé? Ou ne voulez-vous pas le faire vous-même? – Philipp

Répondre

0

La structure d'une requête Intersection est aussi simple que:

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

Ceci renverra toutes les colonnes qui sont les deux sélectionnez les déclarations. Les colonnes renvoyées dans les instructions select doivent être de la même quantité et du même type (ou au moins être convertibles en type commun).

Vous pouvez également effectuer une requête de type intersection en utilisant simplement des jointures internes pour filtrer les enregistrements d'une requête qui ne sont pas dans l'autre. Donc, pour un exemple simple, disons que vous avez deux tables de couleurs.

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

Ceci renverra toutes les couleurs distinctes ColorTable1 qui sont également en ColorTable2. L'utilisation de jointures pour filtrer pourrait améliorer la performance de votre requête, mais elle nécessite plus de réflexion.

Voir aussi: Set Operators (Transact-SQL)

+0

Merci Brian, Pouvez-vous s'il vous plaît modifier celui ci-dessus dans la bonne façon, il devrait être structuré? – Tony77