2017-04-06 83 views
0

我想表用戶與豐資本結合SQL查詢 - 頂部1中加入

表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 
+2

請添加預期結果 –

+0

'加入Firma f上f.Fid = max(f.Fid)'? – Laazo

+0

對於相同的FKod,FId可能有多個同樣最大的值? –

回答

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 
+0

非常感謝。它的作品:) – Ebasse

+1

很高興幫助!如果此**或任何其他答案**已解決您的問題,請點擊複選標記考慮[接受它](http://meta.stackexchange.com/q/5234/179419)。這向更廣泛的社區表明,您已經找到了解決方案,併爲答覆者和您自己提供了一些聲譽。沒有義務這樣做。 –

2

你可以試試這個(我認爲這將是一個良好的習慣,避免,如果不可能性,使用名稱,如用戶和數據庫或其他保留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 
+0

我認爲在第一個選項中你應該加入'A.DATABASE = C.FKOD'和'B.FID = C.MAXFID',否則返回的內部查詢最大'是無用的 –

+0

是的,我錯過了複製/粘貼的一部分。現在我編輯答案。謝謝。 – etsa

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