2013-03-14 69 views
2

我需要使用MS-SQL数据库中的关系表筛选表。使用关系表筛选表MS-SQL

我得到:

persId persName1 catId 

4  Hans  0 
4  Hans  51 
4  Hans  73 
5  Torleif  0 
5  Torleif  5 
5  Torleif 73 
5  Torleif 76 
6  Peter  0 
6  Peter  51 
6  Peter  73 
7  Jonas  0 
7  Jonas  16 
7  Jonas  73 

有:

​​

但我需要。与CATID 51.而且只有1次出现的一个名字和编号删除那些:

persId persName1 

    5   Torleif 
    7   Jonas 

表:

CREATE TABLE [dbo].[tblPerson](
    [persId] [int] IDENTITY(1,1) NOT NULL, 
    [persName1] [varchar](255) NULL, 
CONSTRAINT [PK_tblPerson] PRIMARY KEY CLUSTERED 
) 


CREATE TABLE [dbo].[relCatPers](
    [rcpId] [int] IDENTITY(1,1) NOT NULL, 
    [catId] [int] NOT NULL, 
    [persId] [int] NOT NULL, 
CONSTRAINT [PK_relCatPers] PRIMARY KEY CLUSTERED 
) 
+0

你想返回什么CATID美联社erson?最高? – Josien 2013-03-14 09:13:05

+0

不,76更高。我只想要那些没有51. 而另一个改进是没有得到那些有51和16等。 – 2013-03-14 09:25:05

+1

什么是从其余的选择73'的逻辑? – Kaf 2013-03-14 09:32:30

回答

3

试试这个:

Fiddle 1 demo here

select distinct p.persId, p.persName1 
from tblPerson p left join 
     relCatPers c on p.persId = c.persId 
where p.persId not in 
     (select persId from relCatPers where catId = 51) 

或者你可以忽略relCatPers表,做像下面

Fiddle 2 demo here

select p.persId, p.persName1 
from tblPerson p 
where p.persId not in 
     (select persId from relCatPers where catId = 51) 
+1

不错,没有连接的第二个查询! +1 – Josien 2013-03-14 09:54:39

+1

不错,小提琴 – 2013-03-14 09:55:03

1

试试这个:

With cte as 
(Select persId,persName1, 
     row_number() over (partition by persId,persName1 order by persID) as rn 
from tblPerson 
) 
Select cte.persID,cte.persName1 
from relCatPers 
left join cte 
on tblPerson.persId = relCatPers.persId 
where relCatPers.catid=51 and 
rn=1 
+0

最后一个错误。 所以: 随着CTE为 (选择persId,persName1, ROW_NUMBER()以上(分区由persId,persName1为了通过persID)为RN 从tblperson ) 选择cte.persID,cte.persName1 从relCatPers 左加入cte 上relCatPers.persId = relCatPers.persId 其中relCatPers.catid = 51和 rn = 1 – 2013-03-14 09:53:57

+0

但优雅的解决方案。你认为业绩比其他人好吗?选择在选择等? – 2013-03-14 09:54:35

1

我已经编辑查询,以便它不会返回catId,如您的问题中所定义的:

SELECT distinct 
     tblPerson.persId 
     ,tblPerson.persName1 
FROM tblPerson 
LEFT OUTER JOIN relCatPers ON tblPerson.persId = relCatPers.persId 
WHERE tblPerson.persId NOT IN 
     (SELECT persId FROM relCatPers WHERE catId = 51); 

如果您想添加应该排除人员的其他catId,可以将子查询中的WHERE子句更改为例如WHERE catId IN (16, 23, 51)

+0

感谢您的回答和澄清问题。 – 2013-03-14 12:35:22