尝试从表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
任何帮助将不胜感激!
答案 0 :(得分:1)
它并不完全清楚,但看起来你想要一个左反半连接。有关我更喜欢NOT EXISTS
模式而不是EXCEPT
,LEFT 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