2016-01-13 40 views
0

我有3个表格,如下所示。你会看到他们是如何加入的。只显示连接副本的TOP 1值结果

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

这里是我的解决方案:

创建表:

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

+0

谢谢,这工作很好! – Francis