2013-12-24 138 views
1

我有SQL查詢:子查詢具有多個字段

SELECT DISTINCT t1.inn, 
       t1.idx, 
       (SELECT TOP 1 adr 
       FROM t2 
       WHERE t2.idx = t1.idx 
         AND t2.inn = t1.inn) ADR, 
       (SELECT TOP 1 name 
       FROM t2 
       WHERE t2.idx = t1.idx 
         AND t2.inn = t1.inn) NAME 
FROM t1 

是否有可能使一個子查詢而不是兩個? (即同時選擇TOP 1 ADR和NAME)。服務器:MS SQL 2008-2012。

+1

您可以在沒有ORDER BY的情況下使用'TOP'。你期望什麼結果? –

+0

我想獲得獨特的INN和IDX組合與一些ADR和名稱。每對INN-IDX對應ADR-NAME的編號。我想要得到他們中的任何一個(不管是什麼)。例如。在表中存在3行:INN = 111,IDX = 101,ADR = A1,NAME = N1; INN = 111,IDX = 101,ADR = B1,NAME = N1; INN = 222,IDX = 202,ADR = A2,NAME = N2;我想要得到兩行結果:INN = 111,IDX = 101和INN = 222,IDX = 202,並帶有任何ADR(即對第一行無關緊要的A1或B1) – Andrey

回答

5

你可以用cross apply做到這一點:

select distinct t1.INN, t1.IDX, t2.adr, t2.name 
from t1 cross apply 
    (select top 1 adr, name 
     from t2 
     where t2.idx = t1.idx and t2.inn = t1.inn 
    ) t2; 

但是,你不通過順序來選擇一行。如果只有一行匹配,則可以通過常規聯接來完成此操作。

+0

好極了!非常感謝你。 – Andrey

+0

不僅有一行匹配,但我不使用順序,因爲它是什麼確切的ADR和名稱將被選中並不重要。我只需要每個獨特的INN/IDX – Andrey

+0

真棒的任何一個ADR /名稱。感謝您的想法! – veeTrain