如何加入子查询的第一行?

Ben*_*ter 23 t-sql sql-server sql-server-2000

我有一张发票表和一张与钥匙有关的相关数据的子表.特别是,对于每个发票,我只对子表中的第一个相关行感兴趣.鉴于我希望每个发票密钥都有一个相关的行 - 我该如何做到这一点?

Select i.[Invoice Number],
       c.[Carrier Name]
From Invoice i
    Left Join Carriers c on i.[InvoiceKey] = c.[InvoiceKey]
Where -- what?
Run Code Online (Sandbox Code Playgroud)

我想在语义上讲,我正在寻找类似于概念的东西Top 1 c.CarrierName Group by InvoiceKey(或者如果在T-SQL中可能的话那将是什么概念.)

我考虑过在子查询上进行左连接,但这看起来效率不高.有没有人有任何T-SQL技巧来有效地实现这一目标?

编辑:对不起,伙计们,我忘了提到这是SQL Server 2000,所以虽然我将放弃当前SQL Server 2005/2008响应的投票,但我不敢接受它们.

Qua*_*noi 31

只要Carriers有一个PRIMARY KEYid:

SELECT  i.[Invoice Number],
        c.[Carrier Name]
FROM    Invoice i
JOIN    Carriers c
ON      c.id = 
        (
        SELECT  TOP 1 ID
        FROM    Carriers ci
        WHERE   ci.InvoiceKey = i.InvoiceKey
        ORDER BY
                id -- or whatever
        )
Run Code Online (Sandbox Code Playgroud)

  • @Chris:相比什么?你没有提供一个有效的例子. (4认同)
  • 与 group by 和having 子句相比,其性能可能很差。您正在对 Carriers 表中的 Invoice 中的每一行执行相关子查询。 (2认同)