SQL Server:如何加入第一行

我会用一个具体的,但是假设的例子。

每个订单通常只有一个订单项

命令:

OrderGUID   OrderNumber
=========   ============
{FFB2...}   STL-7442-1      
{3EC6...}   MPT-9931-8A

了LineItem:

LineItemGUID   Order ID Quantity   Description
============   ======== ========   =================================
{098FBE3...}   1        7          prefabulated amulite
{1609B09...}   2        32         spurving bearing

但偶尔会有两个订单项的订单:

LineItemID   Order ID    Quantity   Description
==========   ========    ========   =================================
{A58A1...}   6,784,329   5          pentametric fan
{0E9BC...}   6,784,329   5          differential girdlespring 

通常在向用户显示订单时:

SELECT Orders.OrderNumber, LineItems.Quantity, LineItems.Description
FROM Orders
    INNER JOIN LineItems 
    ON Orders.OrderID = LineItems.OrderID

我想在订单上显示单个项目。 但是,对于包含两个(或更多)物品的偶尔订单,订单将显示为重复

OrderNumber   Quantity   Description
===========   ========   ====================
STL-7442-1    7          prefabulated amulite
MPT-9931-8A   32         spurving bearing
KSG-0619-81   5          panametric fan
KSG-0619-81   5          differential girdlespring

我真正想要的是让SQL Server选择一个,因为它足够好:

OrderNumber   Quantity   Description
===========   ========   ====================
STL-7442-1    7          prefabulated amulite
MPT-9931-8A   32         differential girdlespring
KSG-0619-81   5          panametric fan

如果我喜欢冒险,我可能会向用户展示一个省略号,以表示有多个:

OrderNumber   Quantity   Description
===========   ========   ====================
STL-7442-1    7          prefabulated amulite
MPT-9931-8A   32         differential girdlespring
KSG-0619-81   5          panametric fan, ...

所以问题是如何做到

  • 消除“重复”行
  • 只加入其中一行,以避免重复
  • 第一次尝试

    我第一次天真的尝试只是加入到“ TOP 1 ”项目中:

    SELECT Orders.OrderNumber, LineItems.Quantity, LineItems.Description
    FROM Orders
        INNER JOIN (
           SELECT TOP 1 LineItems.Quantity, LineItems.Description
           FROM LineItems
           WHERE LineItems.OrderID = Orders.OrderID) LineItems2
        ON 1=1
    

    但是,这给出了错误:

    “订单”列或前缀与查询中使用的表名或别名不匹配。

    大概是因为内部选择没有看到外部表格。


    SELECT   Orders.OrderNumber, LineItems.Quantity, LineItems.Description
    FROM     Orders
    JOIN     LineItems
    ON       LineItems.LineItemGUID =
             (
             SELECT  TOP 1 LineItemGUID 
             FROM    LineItems
             WHERE   OrderID = Orders.OrderID
             )
    

    SQL Server 2005及更高版本中,您可以使用CROSS APPLY替换INNER JOIN

    SELECT  Orders.OrderNumber, LineItems2.Quantity, LineItems2.Description
    FROM    Orders
    CROSS APPLY
            (
            SELECT  TOP 1 LineItems.Quantity, LineItems.Description
            FROM    LineItems
            WHERE   LineItems.OrderID = Orders.OrderID
            ) LineItems2
    

    我知道这个问题刚才有答案,但是在处理大型数据集时,嵌套查询可能代价很高。 这是一个不同的解决方案,其中嵌套查询只会运行一次,而不是每个返回的行。

    SELECT 
      Orders.OrderNumber,
      LineItems.Quantity, 
      LineItems.Description
    FROM 
      Orders
      INNER JOIN (
        SELECT
          Orders.OrderNumber,
          Max(LineItem.LineItemID) AS LineItemID
        FROM
          Orders INNER JOIN LineItems
          ON Orders.OrderNumber = LineItems.OrderNumber
        GROUP BY Orders.OrderNumber
      ) AS Items ON Orders.OrderNumber = Items.OrderNumber
      INNER JOIN LineItems 
      ON Items.LineItemID = LineItems.LineItemID
    

    你可以这样做:

    SELECT 
      Orders.OrderNumber, 
      LineItems.Quantity, 
      LineItems.Description
    FROM 
      Orders INNER JOIN LineItems 
      ON Orders.OrderID = LineItems.OrderID
    WHERE
      LineItems.LineItemID = (
        SELECT MIN(LineItemID) 
        FROM   LineItems
        WHERE  OrderID = Orders.OrderID
      )
    

    这需要对一个索引(或主键) LineItems.LineItemID和索引LineItems.OrderID或这将是缓慢的。

    链接地址: http://www.djcxy.com/p/16895.html

    上一篇: SQL Server: How to Join to first row

    下一篇: How can I list all foreign keys referencing a given table in SQL Server?