SELECT DISTINCT表2中的用户不在表2中

时间:2016-07-11 13:06:46

标签: sql ms-access except

我有一个包含4列用户信息的表。每个表都包含以下列:

Username | Full_Name | Job_Name | Current_Job_Allowed

表1包括他们有权查看的所有用户和Job_Name。这意味着表1中有多个具有相同用户名的行具有不同的Job_Name值。

表2包含所有可能用户的列表。

Username      |Full_Name
--------------+-----------------
amunoz        |Andrew Munoz
csmith        |Carl Smith
cwatkins      |Cat Watkins
ggriffiths    |Garmin Griffiths
jcarr         |Jason Carr
jhothi        |Jark Hothi
jphillips     |Jim Phillips
lbradfield    |Lisa Bradfield
ntaylor       |Noria Taylor
rfelipe       |Ralf Felipe

查询1包含我指定的查询参数指定的所有用户,即' KML_20160531'。

我现在想要为我为Job_Name指定的参数选择一个具有不同Job_Name的所有用户的DISTINCT列表。例如,表1包含:

Username|Full_Name   |Job_Name    |Current_Job_Allowed
--------+------------+------------+----------------------
amunoz  |Andrew Munoz|KML_20160531|1
jcarr   |Jason Carr  |KML_20160531|1
rfelipe |Ralf Felipe |KML_20140531|1
amunoz  |Andrew Munoz|KML_20160431|1

当我输入20160531作为Job_Name时,我想返回以下内容。这将返回我输入的Job_Name值的所有可能的新用户。

Username      |Full_Name
--------------+---------------
csmith        |Carl Smith
cwatkins      |Cat Watkins
ggriffiths    |Garmin Griffiths
jhothi        |Jark Hothi
jphillips     |Jim Phillips
lbradfield    |Lisa Bradfield
ntaylor       |Noria Taylor
rfelipe       |Ralf Felipe

4 个答案:

答案 0 :(得分:1)

您可以使用not in和distinct

select distinct a.username, a.fullname 
from table1 as a 
where a.username not in (select distinct username  
                  from table2 where job_name ='my_value');

仅针对作业

select distinct a.username, a.fullname 
from table1 as a 
where a.username not in (select  username  
                   from table2 
                   group by username 
                   having count(job_name) = 1 
                   and job_name ='my_value'   );

答案 1 :(得分:1)

您根本不需要DISTINCT来查询此查询:

select t.*
from table1 as t
where not exists (select 1
                  from table2 as t2
                  where t2.username = t.username and t2.job_name = "KML_20160531"
                 );

根据您对问题的描述,Current_Job_Allowed似乎并不相关。

答案 2 :(得分:1)

此参数查询将显示哪些用户的Table 1Job_Name与参数值匹配:

PARAMETERS which_job Text ( 255 );
SELECT t1.[Username], t1.Job_Name
FROM [Table 1] AS t1
WHERE t1.Job_Name=[which_job];

因此,您可以将其用作子查询,将连接Table 2保留到子查询中,并选择“右侧”为空的行:

PARAMETERS which_job Text ( 255 );
SELECT t2.[Username]
FROM
    [Table 2] AS t2
    LEFT JOIN
        (
            SELECT t1.[Username]
            FROM [Table 1] AS t1
            WHERE t1.Job_Name=[which_job]
        ) AS sub
    ON t2.[Username] = sub.[Username]
WHERE sub.[Username] Is Null;

假设查询返回正确的行,请将您要查看的其他字段添加到SELECT t2.[Username]

除非DISTINCT允许重复的Table 2值,否则您不应该需要Username,或Table 1允许使用Username和{的相同组合的多个行{1}}。

答案 3 :(得分:0)

这将是您的问题的语法

SELECT DISTINCT UserName 
FROM Table1 
WHERE UserName NOT IN (
    SELECT UserName From Table2 
    WHERE job_name = ''
);