仅显示加入重复项

时间:2016-01-13 18:56:19

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

我有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个表的内连接时,我们得到:

enter image description here

我不想要一个重复的DistanceKM,例如。 245.我希望0代替第2行,如下所示:

enter image description here

1 个答案:

答案 0 :(得分: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;

以下是结果:

enter image description here