2010-02-16 7 views
2

나는 다음과 같은 테이블이 말 :제한 결과

 
|RefNumber| Charge| IssueDate| 
------------------------------ 
| 00001| 40.0|2009-01-01| 
| 00002| 40.0|2009-06-21| 

|ID|RefNumber|Forename| Surname| 
--------------------------------- 
    1| 00001|  Joe|  Blogs| 
    2| 00001| David|  Jones| 
    3| 00002| John|  Smith| 
    4| 00002| Paul|  Walsh| 
내가 뒤따라야과 성을 검색 한 다음 두 번째 테이블에 refnumber에 가입 첫 번째 테이블에서 refnumber, 충전 및 issuedate을 선택하고 싶은

하지만, 가장 높은 ID로만 행을 가져옵니다. 내가 유일하게 두 번째 테이블에서 가장 높은 ID를 가진 레코드를 반환 조인에 결과를 제한 할 수있는 확실하지 오전

 

|RefNumber| Charge| IssueDate|ID|Forename| Surname| 
----------------------------------------------------- 
| 00001| 40.0|2009-01-01| 2| David|  Jones| 
| 00002| 40.0|2009-06-21| 4| Paul|  Walsh| 

: 같은

그래서 결과가 보일 것이다.

답변

1

상관 하위 쿼리를 필요로하지 않는이 작성하는 가장 유연한 방법은, ROW_NUMBER (SQL 서버 2005 + 전용)를 사용하는 것입니다 MIN/MAX을 대신 쓸 수 있다면 항상 가장 효율적입니다. 쓰기가 가장 쉽습니다.

하는 당신은 SQL 2000을 실행하고, 또는이 당신이 MIN 또는 MAX 쿼리를 시도 할 수 있습니다, 충분히 효율적인없는 경우 :

SELECT o.RefNumber, o.Charge, o.IssueDate, n.Forename, n.Surname 
FROM Orders o 
[INNER|LEFT] JOIN 
(
    SELECT RefNumber, MIN(ID) AS MinID 
    FROM Names 
    GROUP BY RefNumber 
) m 
    ON m.RefNumber = o.RefNumber 
[INNER|LEFT] JOIN Names n 
    ON n.ID = m.MinID 

때때로 이것은 실제로 빠른을, 그것은 인덱싱 전략에 많이 의존 익숙한.

(편집 -이 빠르게 가장 높은 ID를 얻는 것보다 될 것입니다 대부분의 경우에 가장 낮은 ID를 가진 행을 얻을 당신이 가장 높은 필요한 경우, ORDER BY ID DESC에 첫 번째 쿼리 및 사용할 수있는 두 번째 쿼리를 변경합니다. MIN 대신 MAX).

1

아마도 가장 높은 ID를 가진 두 번째 테이블의 레코드 만 반환하는 하위 쿼리에 대해 조인 할 것입니다. 도움이

select 
     a.RefNumber, a.Charge, a.IssueDate, b.BiggestID, b.Forename, b.Surname 
from References a 
inner join 
    (select 
      RefNumber, 
      max(ID) as BiggestID 
    from Names 
    group by 
      RefNumber) b 
    on a.RefNumber = b.RefNumber 

희망 : 그 이상과 같이 할 수 있도록

select a.RefNumber, a.Charge, a.IssueDate, b.ID, b.Forename, b.Surname 
from References a inner join 
    (select ID, RefNumber, ForeName, Surname from Names n1 
     where n1.ID = (select top 1 n2.ID from Names n2 where n1.RefNumber = n2.RefNumber)) b 
    on a.RefNumber = b.RefNumber 
+0

'TOP 1'은 * one * 행만 반환합니다. 가장 높은 ID를 가진 refnumber 값을 가진 레코드의 데이터 일뿐입니다. 그 중 하나의 refnumber 값만 있습니다. –

+0

죄송합니다. 중첩의 한 단계 더 필요 ... – tvanfosson

0

실제로 하위 쿼리는 각 refnumber 가장 높은 ID를 선택해야합니다.

;WITH Names_CTE AS 
(
    SELECT 
     ID, RefNumber, Forename, Surname, 
     ROW_NUMBER() OVER (PARTITION BY RefNumber ORDER BY ID) AS RowNum 
    FROM Names 
) 
SELECT o.RefNumber, o.Charge, o.IssueDate, n.Forename, n.Surname 
FROM Orders o 
[INNER|LEFT] JOIN Names_CTE n 
    ON n.RefNumber = o.RefNumber 
WHERE n.RowNum = 1 

참고 ROW_NUMBER ISN : 톰

0
select nt.RefNumber, ct.Charge, ct.IssueDate, nt.ID, nt.Forename, nt.Surname 
from NameTable nt 
join ChargeTable ct on (ct.RefNumber = nt.RefNumber) 
where nt.ID = (select MAX(nt2.id) 
       from NameTable nt2 
       where nt2.RefNumber = nt.RefNumber) 
order by nt.ID