SQL查询 - 连接中的前1位

时间:2017-04-06 07:26:32

标签: sql sql-server tsql join

我想将表用户与Firma结合起来

表dbo.User

Id  Server  Database    BiEnable    BiPerm
1   5       TEST        1           NULL

表dbo.Firma

FId FKod    FAktywna    FInst
1   TEST    0           3
2   TEST    0           4
4   TEST    1           5

必须通过[用户]表格中的[数据库]字段和[Firma]表格中的[Fkod]字段进行链接,但仅限于[Fid]总是最大的行(我们有一些情况)同名)。 这个查询应该怎么样?

@edit: 预期结果:

Id  Server  Database    BiEnable    BiPerm  FId FKod    FAktywna    FInst
1   5       TEST        1           NULL    4   TEST    1           5

3 个答案:

答案 0 :(得分:2)

你可以试试这个(我认为如果可能的话,避免在表中使用USER和DATABASE等名称或其他保留的MSSQL单词是一个好习惯):

SELECT A.*, B.* 
FROM [USER] A
INNER JOIN FIRMA B ON A.[DATABASE] = B.FKOD
INNER JOIN (SELECT FKOD, MAX(FID) AS MAXFID FROM FIRMA GROUP BY FKOD) C ON A.[DATABASE] = C.FKOD AND C.MAXFID =B.FID

如果您可以使用Windows分析功能:

SELECT A.*, B.* 
FROM [USER] A
INNER JOIN (SELECT *, ROW_NUMBER() OVER (PARTITION BY FKOD ORDER BY FID DESC) AS RN FROM FIRMA) B ON A.DATABASE = B.FKOD AND B.RN = 1

答案 1 :(得分:1)

这将为每个FId

返回最高FKod
select  FKod, max(FId)
from    Firma
group by FKod

然后,您可以通过将其与两个原始表

连接来将其用作过滤器
select  *
from    User t1
join    Firma t2
on      t1.Database = t2.FKod
join    (
            select  FKod, max(FId) FId
            from    Firma
            group by FKod
        ) t3
on      t2.FId = t3.FId and
        t2.FKod = t3.FKod

答案 2 :(得分:0)

与@ etsa的查询基本相同,使用WITH TIES

简化
SELECT A.*, B.* 
FROM [USER] A
INNER JOIN (
    SELECT TOP(1) WITH TIES * 
    FROM FIRMA
    ORDER BY ROW_NUMBER() OVER (PARTITION BY FKOD ORDER BY FID DESC)
) B ON A.DATABASE = B.FKOD