2013-03-18 40 views
2

我想采取不同的病人记录,并显示在一个网格取区分记录与JOIN

耐心表

PatientId, FirstName, LastName, City 

的预订表

BookingId, PatientId, CategoryId, BookingDate 

下方运行查询给出重复的患者记录。发生这种情况是因为我为不同日期的同一患者预订了3次。该查询使得加入并带来3个患者记录而不是1个患者记录。

SELECT DISTINCT PAT.PatientId 
,PAT.FirstName 
,PAT.LastName  

,ROW_NUMBER() OVER (ORDER BY PAT.PatientId DESC) AS RowNumber 
INTO #itemSearch 
FROM dbo.Patient AS PAT 

INNER JOIN dbo.Booking AS B 
ON PAT.PatientId = B.PatientId WHERE B.CategoryId = 1 

如果我删除这一行,我只得到1.但我需要这个临时表的其他寻呼过程。

ROW_NUMBER() OVER (ORDER BY PAT.PatientId DESC) AS RowNumber INTO #itemSearch 

即使他们有3个预订,我怎样才能得到1个病人?

+2

使用**通过PAT.PatientID)集团** – Dhinakar 2013-03-18 12:05:34

+0

因为DISTINCT将ROW_NUMBER后执行(排名功能。 – 2013-03-18 12:15:45

+0

@AlexanderFedorenko,哦,我明白了。还有其他的选择吗? – Billa 2013-03-18 12:16:23

回答

2

使用GROUP BY子句

SELECT PAT.PatientId 
     ,PAT.FirstName 
     ,PAT.LastName  
     ,ROW_NUMBER() OVER (ORDER BY PAT.PatientId DESC) AS RowNumber 
INTO #itemSearch 
FROM dbo.Patient AS PAT 
    INNER JOIN dbo.Booking AS B 
    ON PAT.PatientId = B.PatientId 
WHERE B.CategoryId = 1 
GROUP BY PAT.PatientId, PAT.FirstName, PAT.LastName 

或使用DISTINCT与DENSE_RANK()排名功能

SELECT DISTINCT PAT.PatientId 
     ,PAT.FirstName 
     ,PAT.LastName  
     ,DENSE_RANK() OVER (ORDER BY PAT.PatientId DESC) AS RowNumber 
INTO #itemSearch 
FROM dbo.Patient AS PAT 
    INNER JOIN dbo.Booking AS B 
    ON PAT.PatientId = B.PatientId 
WHERE B.CategoryId = 1 
+0

这真是太棒了:)为我工作:) – Billa 2013-03-18 13:04:47

+0

@BadDeveloper Answer updated;) – 2013-03-18 13:22:02