Sql 限制联接查询的结果
假设我有以下表格: |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最高的行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
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