如何从表1中返回表1中不存在的表1中的两列(NoCond,Name)

时间:2014-02-01 20:21:33

标签: sql-server stored-procedures

尝试从表1中获取其他列时尝试返回的问题 表2中缺少表2中的NoCond和Name列,用于taable2.NoPro = AR102 SQL SERVER 2008

表1

NoCond  Cat     Name

001  G      INFORME JURIDICO
001  E      MANUAL OPERATIVO
002  G      ASIGNACION DE RECURSOS
002  E      CONSTITUCION DE LA UNIDAD EJECUTORA
003  G      PLAN DE CUENTAS
003  E      PLAN OPERATIVO
004  E      CONTRATACION AUDITORIA INDEPENDIENTE
004  G      PLAN DE EJECUCION
005  G      INFORME INICIAL
006  G      CONVENIO DE AUDITORIA
007  G      FIRMAS AUTORIZADAS

表2

NoPro   NoCond  Cat
AR101    002    G
AR101    005    G

AR102    003    G
AR102    006    G

AR103    001    G
AR103    005

预期结果 :(表1中的NoCon表2中不存在NoProj = AR102

NoCond Name
001    INFORME JURIDICO
002    ASIGNACION DE RECURSOS
004    PLAN DE EJECUCION
005    INFORME INICIAL
007    FIRMAS AUTORIZADAS

尝试以下存储过程以仅从表2中获取缺少的NoCond

SELECT NoCondicion 
FROM   Condiciones AS T1
EXCEPT
SELECT NoCondicion 
FROM   ProyectosCondiciones AS T2 
WHERE  T2.NoProyecto = 'AR102' AND T2.Categoria = 'G'

投掷的结果是正确的

001
002
004
005
007

但是当我也尝试使用此代码获取Name列时:

SELECT NoCond, Name
FROM   Table1 AS T1
EXCEPT
SELECT NoCond, NULL 
FROM   Table2 AS T2 
WHERE  T2.NoPro = 'AR102' AND T2.Cat = 'G'

我得到表1的全部内容,而不是表2中不存在的内容

001 INFORME JURIDICO
001 MANUAL OPERATIVO
002 ASIGNACION DE RECURSOS
002 CONSTITUCION DE LA UNIDAD EJECUTORA
003 PLAN DE CUENTAS
003 PLAN OPERATIVO
004 CONTRATACION AUDITORIA INDEPENDIENTE
004 PLAN DE EJECUCION
005 INFORME INICIAL
006 CONVENIO DE AUDITORIA
007 FIRMAS AUTORIZADAS

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:1)

它并不完全清楚,但看起来你想要一个左反半连接。有关我更喜欢NOT EXISTS模式而不是EXCEPTLEFT JOIN ... WHERE NULL等原因的详细信息,请参阅this article

SELECT T1.NoCondicion, T1.Name
  FROM dbo.Table1 AS T1
  WHERE T1.Categoria = 'G'
  AND NOT EXISTS
  (
    SELECT 1 FROM dbo.Table2 AS T2 
      WHERE T2.NoCondicion = T1.NoCondicion
        AND T2.NoProj = 'AR102'
        AND T2.Categoria = 'G'
  );

答案 1 :(得分:0)

SELECT t1.*
FROM <Table 1> t1
LEFT JOIN <Table 2> t2
    ON t1.NoCond = t2.NoCond
    AND t2.NoPro = 'AR102'
WHERE t2.NoCond is null