2010-02-16 73 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,從第一臺充issuedate然後refnumber加入到第二個表檢索的名字及姓氏,但只得到最高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| 

我不能確定誰以限制參加僅從第二表中返回具有最高ID的記錄結果。

回答

1

最靈活的方式來寫這個,不需要相關子查詢,就是用ROW_NUMBER(僅適用於SQL Server的2005+):

;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如果您可以使用MIN/MAX,那麼總是最有效率,只是最容易編寫。

如果您正在運行SQL 2000,或者這是效率不高的話,你可以嘗試MINMAX查詢:

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和使用第二查詢。 MAX而不是MIN)。

1

我可能會加入一個子查詢,它只返回第二個表中最高ID的記錄。

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'只會返回*一個*行 - 您只會記錄具有最高ID的refnumber值的記錄,並且只有一個refnumber值。 – 2010-02-16 22:27:30

+0

糟糕。需要更多層次的嵌套... – tvanfosson 2010-02-16 22:37:03

0

其實你的子查詢需要選擇每個refnumber最高的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 

希望有所幫助。 -Tom

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