SQL一对多查询条件

时间:2013-12-08 22:05:40

标签: sql one-to-many

我在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')

感谢您的任何建议。

2 个答案:

答案 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 JOINEmp_IDStatus WHERE Status。这样,如果您检查条件Active表2的Table1Status,但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')

sqlfiddle demo

这将为您提供table1中无活动状态的记录:

EMP_ID  STATUS  ALIAS
54321   active  West