避免在连接中重复使用值

时间:2016-10-06 08:52:17

标签: sql sql-server

我有两个表 - 标题和矩阵/细节。

*Header Table*               *Matrix / Details Table*
+----+--------+-----+        +----+--------+------+
| ID | Parent | Qty |        | ID | Child  | Qty  |
+----+--------+-----+        +----+--------+------+
| 1  |   A    | 10  |        | 1  |   X    | 100  |
| 2  |   B    | 20  |        | 1  |   Y    | 1000 |
| 3  |   C    | 30  |        | 2  |   X    | 200  |
+----+--------+-----+        | 2  |   Y    | 2000 |
                             | 3  |   X    | 30   |
                             | 3  |   Y    | 300  |
                             | 3  |   Z    | 3000 |
                             +----+--------+------+

我正在根据ID加入这两个表。

我不希望结果从头表中获得重复值。 我希望得到如下结果:

*Current Result*                          *Expected Result*
+----+--------+-----+-------+------+      +----+--------+-----+-------+------+
| ID | Parent | Qty | Child | Qty  |      | ID | Parent | Qty | Child | Qty  |
+----+--------+-----+-------+------+      +----+--------+-----+-------+------+
| 1  |   A    | 10  |   X   | 100  |      | 1  |   A    | 10  |   X   | 100  |
| 1  |   A    | 10  |   Y   | 1000 |      |    |        |     |   Y   | 1000 |
| 2  |   B    | 20  |   X   | 200  |      | 2  |   B    | 20  |   X   | 200  |
| 2  |   B    | 20  |   Y   | 2000 |      |    |        |     |   Y   | 2000 |
| 3  |   C    | 30  |   X   | 30   |      | 3  |   C    | 30  |   X   | 30   |
| 3  |   C    | 30  |   Y   | 300  |      |    |        |     |   Y   | 300  |
| 3  |   C    | 30  |   Z   | 3000 |      |    |        |     |   Z   | 3000 |
+----+--------+-----+-------+------+      +----+--------+-----+-------+------+

这可能吗?如果没有,备用解决方案可用吗?

提前致谢...

1 个答案:

答案 0 :(得分:1)

如果您使用的是SQL Server,请尝试使用以下查询。

;WITH CTE_1
AS
(SELECT *,ROW_NUMBER()OVER(PARTITION BY ID,Parent,Quantity ORDER BY ID ) RNO
FROM Header  H
JOIN [Matrix / Details] M
 ON H.ID=M.ID)

 SELECT CASE WHEN RNO=1 THEN CAST(ID as VARCHAR(50)) ELSE '' END  ID,
        CASE WHEN RNO=1 THEN Parent ELSE '' END  Parent,
        CASE WHEN RNO=1 THEN cast(Quantity as VARCHAR(50)) ELSE '' END  Quantity,
        Child,Qty
 FROM  CTE_1
 ORDER BY ID,Parent,Quantity