Sql 限制联接查询的结果

Sql 限制联接查询的结果,sql,tsql,join,Sql,Tsql,Join,假设我有以下表格: |RefNumber| Charge| IssueDate| ------------------------------ | 00001| 40.0|2009-01-01| | 00002| 40.0|2009-06-21| |ID|RefNumber|Forename| Surname| --------------------------------- 1| 00001| Joe| Blogs| 2| 0

假设我有以下表格:

|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、charge和issuedate,然后在refnumber上连接到第二个表以检索名字和姓氏,但只获取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
因此,结果如下所示:

|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最高的记录。

我可能会对只返回第二个表中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

实际上,您的子查询需要为每个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

编写此命令最灵活的方法,不需要相关的子查询,是仅使用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
请注意,如果可以使用MIN/MAX,则行数并不总是最有效的,只是最容易写入

如果您正在运行SQL 2000,或者这不够高效,可以尝试使用最小或最大查询:

有时这实际上更快,这在很大程度上取决于所使用的索引策略

编辑-这将获取ID最低的行,在大多数情况下,这将比获取最高ID更快。如果需要最高ID,请将第一个查询更改为ORDER BY ID DESC,将第二个查询更改为使用MAX而不是MIN。

TOP 1将只返回一行-您将仅是ID最高的refnumber值记录的数据,此时只有一个refnumber值。
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