2013-03-14 78 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