2013-12-24 79 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