2012-03-14 5 views
3

J'ai requête comme ci-dessous:SQLServer union d'écriture dans une seule instruction



SELECT * FROM [PMDB_DEV].[dbo].[TRSRCFIN] 
WHERE proj_id = 167592 
AND taskrsrc_id NOT IN 
(
SELECT taskrsrc_id FROM [PMDB_ARC].[dbo].[TRSRCFIN_TEST] 
WHERE proj_id = 167592 
) 
UNION 
SELECT * FROM [PMDB_DEV].[dbo].[TRSRCFIN] 
WHERE proj_id = 167592 
AND fin_dates_id NOT IN 
(
SELECT fin_dates_id FROM [PMDB_ARC].[dbo].[TRSRCFIN_TEST] 
WHERE proj_id = 167592 
) 

Fondamentalement, la requête renvoie toutes les lignes où soit taskrsrc_id ou fin_dates_id ne devrait pas dans les données sous-requête. Puis-je faire ceci sans utiliser UNION ???

Merci, Mahesh

Répondre

2
select * 
from [PMDB_DEV].[dbo].[TRSRCFIN] t1 
where proj_id = 167592 
     and not exists 
     (
     select * 
     from [PMDB_ARC].[dbo].[TRSRCFIN_TEST] t2 
     where t2.proj_id = t1.proj_id 
       and (
        t1.taskrsrc_id = t2.taskrsrc_id 
        or 
        t1.fin_dates_id = t2.fin_dates_id 
       ) 
     ) 
0

Je crois que ce serait faire:

SELECT * 
FROM [PMDB_DEV].[dbo].[TRSRCFIN] 
WHERE proj_id = 167592 
and not exists (select null from [PMDB_ARC].[dbo].[TRSRCFIN_TEST] 
       WHERE proj_id = TRSRCFIN.proj_id 
        and (TRSRCFIN_TEST.taskrsrc_id = TRSRCFIN.taskrsrc_id 
        or TRSRCFIN_TEST.fin_dates_id = TRSRCFIN.fin_dates_id) 
       ) 
0

Peut-être quelque chose comme ceci:

SELECT 
    * 
FROM 
    [PMDB_DEV].[dbo].[TRSRCFIN] 
WHERE 
    proj_id =167592 
    AND NOT EXISTS 
    (
     SELECT 
      NULL 
     FROM 
      [PMDB_ARC].[dbo].[TRSRCFIN_TEST] 
     WHERE 
      [PMDB_ARC].[dbo].[TRSRCFIN_TEST].proj_id = [PMDB_DEV].[dbo].[TRSRCFIN].proj_id 
      AND 
      (
       [PMDB_ARC].[dbo].[TRSRCFIN_TEST].taskrsrc_id= [PMDB_DEV].[dbo].[TRSRCFIN].taskrsrc_id 
       OR [PMDB_ARC].[dbo].[TRSRCFIN_TEST].fin_dates_id= [PMDB_DEV].[dbo].[TRSRCFIN].fin_dates_id 
      ) 
    ) 
0

pourquoi?

si vous avez des index appropriés (un sur proj + taskrsrc_id et un sur proj + fin_dates_id) il est fort probable que cette requête UNION utilisera les index et être plus rapide qu'une requête qui n'utilise pas l'UNION (et ne peut pas utiliser les deux index). Je m'inquiéterais plus sur l'optimisation du * et du NOT IN si quelque chose.

Questions connexes