我在SQL Server 2008中有一对多查询时遇到一些困难,我有两个表(Table1& Table2 - Create Table语句如下)。
我正在尝试查找Table2中表1中没有Active状态的所有Active记录,我遇到的问题是table1可以为单个emp_id创建多个记录,同时包含active和amp;无效状态。
这里的目标是,如果你在table2中处于活动状态,你必须至少在table1中有一个活动记录,我不在乎你是否也处于非活动状态,只要你至少有一个活动状态,如果没有,我想知道你是谁。
CREATE TABLE Table1
([Emp_ID] int, [Status] varchar(10), [code] varchar(10))
;
INSERT INTO Table1
([Emp_ID], [Status], [code])
VALUES
(12345, 'active', 'red'),
(12345, 'inactive', 'blue'),
(88888, 'active', 'green'),
(12345, 'active', 'green'),
(54321, 'inactive', 'blue'),
(54321, 'inactive', 'green')
;
CREATE TABLE Table2
([Emp_ID] int, [Status] varchar(10), [Alias] varchar(10))
;
INSERT INTO Table2
([Emp_ID], [Status], [alias])
VALUES
(12345, 'active', 'smith'),
(88888, 'active', 'Jones'),
(54321, 'active', 'West')
;
我认为这样的事情但它没有返回任何结果,我应该返回emp_id = 54321 因为它们在table1中没有一个活动行,但在table2中是活动的。
select table2.*
From table2
Inner Join Table1
On table2.emp_id = table1.emp_id
Where Table2.status = 'Active'
AND Not EXISTS (select * from table1 where table1.status = 'Active')
感谢您的任何建议。
答案 0 :(得分:2)
以下是 SQLFiddle.com 上的工作示例:http://sqlfiddle.com/#!3/bd302/8
SELECT T2.*
FROM Table2 T2 LEFT JOIN Table1 T1
ON T2.Emp_ID = T1.Emp_ID AND T2.Status = T1.Status
WHERE T2.Status = 'Active' AND T1.Status IS NULL
说明:您必须LEFT JOIN
Table2
Table1
JOIN
,Emp_ID
和Status
WHERE
Status
。这样,如果您检查条件Active
表2的Table1
是Status
,但NULL
'Active'
是Table1
,则表示没有Table2
Emp_ID
{{1}}中显示的{{1}}个{{1}}个记录。
答案 1 :(得分:1)
我不认为你与table1的内部联接正在做任何事情。它所做的就是复制table2的结果。您需要的验证是通过EXISTS完成的。你应该将t2.emp_id与EXISTS子查询联系起来:
select t2.*
from table2 t2
where t2.status = 'Active'
and not exists (select 1
from table1 tt
where tt.emp_id = t2.emp_id
and tt.status = 'Active')
这将为您提供table1中无活动状态的记录:
EMP_ID STATUS ALIAS
54321 active West