Sql 具有多条记录的ID-如何找到我需要的记录?

Sql 具有多条记录的ID-如何找到我需要的记录?,sql,sql-server,Sql,Sql Server,我有一个表Job Types,其中包含完成工作的人的ID、工作完成的年份YYYY和Jobtype ID |ID | YEAR | JOBTYPE| |123A| 2017 |1 |124A| 2017 |2 |125A| 2016 | 2 |126A| 2017 |3 |123A| 2017 |2 |125A| 2016 |2 我需要的是找到2017年仅完成Jobtype 2的每个人的ID。在上表中,这仅为124A。2016年完成125

我有一个表Job Types,其中包含完成工作的人的ID、工作完成的年份YYYY和Jobtype ID

|ID |   YEAR    | JOBTYPE|
|123A|  2017    |1
|124A|  2017    |2
|125A|  2016    | 2
|126A|  2017    |3
|123A|  2017    |2
|125A|  2016    |2
我需要的是找到2017年仅完成Jobtype 2的每个人的ID。在上表中,这仅为124A。2016年完成125A项工作类型2;123A分别为1和2;等旁注:如果一个ID在2017年完成了多个Jobtype 2s,这无关紧要——我想要这些记录


我该怎么做?我尝试了一些notexists查询,但我想我被卡住了,因为1id可能有很多记录。我猜我需要以某种方式组合数据,使每个ID都有一条记录,然后以这种方式查询它?还是我遗漏了一些非常明显的东西?我在SQL Server 2012中工作,只是看不到前进的方向。抱歉,如果我遗漏了一些非常简单的内容,但我通常没有理由做select语句以外的任何事情。

编写一个查询,以获取2017年作业类型完成数不是2的所有id,然后仅选择id不在第一次查询结果中的记录:

SELECT *
FROM table
WHERE jobtype = 2 and year = 2017
    AND id NOT IN (SELECT id FROM table WHERE jobtype <> 2 and Year=2017)

编写一个查询以获取2017年作业类型完成不为2的所有id,然后仅选择id不在第一次查询结果中的记录:

SELECT *
FROM table
WHERE jobtype = 2 and year = 2017
    AND id NOT IN (SELECT id FROM table WHERE jobtype <> 2 and Year=2017)

您需要每个ID的信息,所以请按ID分组。然后过滤。例如:

这些标准很容易调整。例如,其他人理解您的标准的意思是:2017年有一项或多项2017年2项记录,没有其他记录,而我理解为一项或多项2017年2项记录,没有其他记录。如果您只想看2017年:

select id
from jobtypes
where year = 2017
having min(jobtype) = 2
   and max(jobtype) = 2
;

无论应用何种标准,该表只需读取一次。

您需要每个ID的信息,所以请按ID分组。然后过滤。例如:

这些标准很容易调整。例如,其他人理解您的标准的意思是:2017年有一项或多项2017年2项记录,没有其他记录,而我理解为一项或多项2017年2项记录,没有其他记录。如果您只想看2017年:

select id
from jobtypes
where year = 2017
having min(jobtype) = 2
   and max(jobtype) = 2
;
无论采用何种标准,表格只需阅读一次。

希望这能奏效

SELECT * FROM #Your_Table A WHERE JobType=2 AND Year=2017 AND NOT EXISTS(
SELECT ID FROM (SELECT *,Row_number() Over(Partition by ID Order by ID) AS Row_Num FROM #Your_Table)B
WHERE JobType=2 and Row_num>1 and B.ID=A.ID)
希望这能奏效

SELECT * FROM #Your_Table A WHERE JobType=2 AND Year=2017 AND NOT EXISTS(
SELECT ID FROM (SELECT *,Row_number() Over(Partition by ID Order by ID) AS Row_Num FROM #Your_Table)B
WHERE JobType=2 and Row_num>1 and B.ID=A.ID)

啊!不在!非常感谢-我显然是在尝试创建一个比需要的复杂得多的解决方案!啊!不在!非常感谢-我显然是在尝试创建一个比需要的复杂得多的解决方案!