【问题标题】:Showing only TOP 1 value result from join duplicates仅显示连接重复项的 TOP 1 值结果
【发布时间】:2016-04-18 21:49:13
【问题描述】:

我有 3 个如下表。您将看到它们是如何连接的。

Orders Table  
+---------+------------+
| Orderid | LocationId |
+---------+------------+
| 36      | 14         |
| 38      | 13         |
+---------+------------+

OrdersDetails Table
+-----------+------------+
| Detailsid | OrderId    |
+-----------+------------+
| 38        | 36         |
| 39        | 36         |
| 40        | 38         |
+-----------+------------+

OrderLocations
+------------+------------+
| Locationid | DistanceKM |
+------------+------------+
| 13         | 550        |
| 14         | 245        |
+------------+------------+

在对我们得到的 3 个表进行内部连接时:

我不想有重复的 DistanceKM,例如。 245. 我想用 0 代替第 2 行,如下所示:

【问题讨论】:

    标签: tsql join sql-server-2008-r2


    【解决方案1】:

    这是我的解决方案:

    创建表格:

        CREATE TABLE #Orders
                        (
                 Orderid INT, LocationId INT
                        );
    
    INSERT INTO #Orders
    VALUES
           (36, 14
           ),
           (38, 13
           );
    
    CREATE TABLE #OrdersDetails
                               (
                 Detailsid INT, OrderId INT
                               );
    
    INSERT INTO #OrdersDetails
    VALUES
           (38, 36
           ),
           (39, 36
           ),
           (40, 38
           );
    
    CREATE TABLE #OrderLocations
                                (
                 Locationid INT, DistanceKM INT
                                );
    
    INSERT INTO #OrderLocations
    VALUES
           (13, 550
           ),
           (14, 245
           );
    

    实际查询:

    ;WITH cte
         AS
            (SELECT o.Orderid, d.Detailsid, l.DistanceKM, ROW_NUMBER() OVER
                                                                           (PARTITION BY l.DistanceKM ORDER BY o.Orderid
                                                                           ) AS rn
             FROM #Orders AS o
             INNER JOIN
             #OrdersDetails AS d
             ON o.Orderid = d.OrderId
             INNER JOIN
             #OrderLocations AS l
             ON o.LocationId = l.Locationid
            )
         SELECT cte.Orderid, cte.Detailsid,
                                 CASE
                                     WHEN cte.rn > 1
                                     THEN 0
                                     ELSE cte.DistanceKM
                                 END AS DistanceKM
         FROM CTE;
    

    结果如下:

    【讨论】:

      猜你喜欢
      • 2013-11-23
      • 2018-11-02
      • 1970-01-01
      • 2021-04-12
      • 2017-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多