【问题标题】:MSSql Parent child relationship, retrieve top child and join other tableMSSql 父子关系,检索top child并加入其他表
【发布时间】:2016-01-19 16:39:15
【问题描述】:

所以我在http://sqlfiddle.com/#!6/5836b(类似)和下面有这个表结构。 PForecast 表将对顶级(父)productsku 进行预测。一旦我获得给定期间的预测项目列表,我需要检索具有最高优先级 (Ppriority) 编号的子项的产品详细信息(对于该父 sku)。还想在单独的列中列出所有其他子 sku(可选)。

create TABLE PForecast (ID INT, sku INT, qty int, entrydate datetime);

INSERT INTO PForecast  (ID, sku, qty, entrydate)
VALUES(10, 29490, 1, '2016-09-04 00:00:00.000'),
(19, 112407, 1, '2016-09-04 00:00:00.000'),
(11, 112407, 1, '2016-11-14 00:00:00.000'),
(12, 112344, 12, '2016-01-24 00:00:00.000'),
(13, 112344, 17, '2016-02-05 00:00:00.000'),
(14, 112344, 11, '2016-06-03 00:00:00.000'),
(15, 264856, 7, '2016-05-09 00:00:00.000'),
(16, 26480, 9, '2016-07-18 00:00:00.000'),
(17, 264856, 4, '2016-09-27 00:00:00.000'),
(18, 29490, 2, '2016-12-02 00:00:00.000');


create TABLE AllProd2 (sku INT, ID INT, descrip varchar(100), dept varchar(100),
                       SubDept varchar(100), class varchar(100), SubClass varchar(100),
                      Vcode INT, PID INT, Ppriority INT, parentFlag VARCHAR(1));

INSERT INTO AllProd2  (sku, ID, descrip, dept, SubDept, class, SubClass, Vcode, PID, Ppriority, parentFlag)
VALUES
(169243, 21177, '14 DIA PC/RD', 'abc', 'def', 'xyz', 'gty', 0004, 1043419,  1, 'C'),
(136643, 21394, '14 DIA PC/RD', 'abc', 'def', 'xyz', 'gty', 0004, 1043419,  2, 'C'),
(112344, 1043419, '14 DIA PC/RD', 'abc', 'def', 'xyz', 'gty', 0004, 1043419,    NULL, 'P'),
(104516, 122, '14 DIA PC/RD', 'abc', 'def', 'xyz', 'gty', 0004, 1043428,    2, 'C'),
(111508, 130, '14 DIA PC/RD', 'abc', 'def', 'xyz', 'gty', 0004, 1043428,    1, 'C'),
(112407, 1043428, '14 DIA PC/RD', 'abc', 'def', 'xyz', 'gty', 0004, 1043428,    NULL, 'P'),
(115106, 17043838, '14 DIA PC/RD', 'abc', 'def', 'xyz', 'gty', 0004, 1043428,   3, 'C'),
(161835, 116050567, '14 DIA PC/RD', 'abc', 'def', 'xyz', 'gty', 0004, 1043428,  4, 'C'),
(238777, 1198119585, '14 DIA PC/RD', 'abc', 'def', 'xyz', 'gty', 0004, 1043428, 5, 'C'),
(255210, 2092139762, '14 DIA PC/RD', 'abc', 'def', 'xyz', 'gty', 0004, 1043555, 2, 'C'),
(264856, 1043555, '14 DIA PC/RD', 'abc', 'def', 'xyz', 'gty', 0004, 1043555,    NULL, 'P'),
(264863, 1043556, '14 DIA PC/RD', 'abc', 'def', 'xyz', 'gty', 0004, 1043555,    1, 'C'),
(239124, 1995137332, '14 RD', 'abc', 'def', 'xyz', 'gty', 0004, 1043890,    1, 'C'),
(266473, 1043889, '14 RD', 'abc', 'def', 'xyz', 'gty', 0004, 1043890,   2, 'C'),
(266480, 1043890, '14 RD', 'abc', 'def', 'xyz', 'gty', 0004, 1043890,   NULL, 'P'),
(26480, 10430, '14 PC/RD', 'abc', 'def', 'xyz', 'gty', 0007, 10430, NULL, 'P'),
(29490, 14480, '14 PC/RD hkj', 'abc', 'def', 'xyz', 'gty', 0004, 14480, NULL, 'N')
;

如果我可以使用数据集构建一个临时表会更好,因为我需要在此步骤之后获取更多信息并加入其他表。

感谢任何帮助。

【问题讨论】:

  • 请提供示例或所需结果。目前尚不清楚您在寻找什么。
  • 查询将从预测表中选择一个日期范围内的所有项目,从我的表设计中可以看出,预测只有父sku,没有子sku。因此,下一步是从产品表中获取子 sku(针对该父记录),并为详细预测构建一个新结果集。即 SKU 26480 在预测表中有 3 个条目,我的最终结果应该是这样的:
  • 更新评论:查询将从预测中选择日期范围内的所有项目,正如您在小提琴中看到的那样,预测只有父 sku。下一步是从 prod 表中获取子 sku(针对该父记录),并为详细预测构建新的结果集。即 SKU 112344 在预测表中有 3 个条目,如果我查看产品表,则该 SKU 的父 ID 是 1043419。此查询应捕获排名最高的 Ppriority 并获取整行。所以我的最终结果应该是这样的: SKU:136643 ID: 21394 VCode: 4 ParentID: 1043419 ParentPriority: 2 ParentFlag: C

标签: sql-server tsql parent-child


【解决方案1】:

通过阅读您的评论,我认为您正在寻找类似以下内容:

DECLARE @startDate DATE = '2016-06-01', @endDate DATE = '2016-12-01'
SELECT A.*, STUFF((
    SELECT ', ' + CASE WHEN PPriority IS NULL THEN 'P' + CONVERT(NVARCHAR, SKU) ELSE CONVERT(NVARCHAR, SKU) END
    FROM AllProd2
    WHERE PID = A.PID
    AND ISNULL(PPriority, 0) <> A.PPriority
    ORDER BY CASE WHEN PPriority IS NULL THEN 0 ELSE 1 END, PPriority
    FOR XML PATH ('')), 1, 2, '') OtherSKU
-- INTO #tmpResults
FROM (SELECT SKU 
    FROM PForecast 
    WHERE entrydate >= @startDate 
    AND entrydate <= @endDate 
    GROUP BY SKU) P 
LEFT JOIN AllProd2 A ON P.SKU = (SELECT SKU FROM AllProd2 WHERE ID = A.PID)
WHERE ISNULL(PPriority, 0) = (SELECT MAX(ISNULL(PPriority, 0)) FROM AllProd2 WHERE PID = A.PID)

这给出了指定日期范围的以下内容:

+--------+------------+--------------+-----+-----+-----+-----+---+---------+------+---+-----------------------------------------+
|  26480 |      10430 | 14 PC/RD     | abc | def | xyz | gty | 7 |   10430 | NULL | P | NULL                                    |
|  29490 |      14480 | 14 PC/RD hkj | abc | def | xyz | gty | 4 |   14480 | NULL | N | NULL                                    |
| 136643 |      21394 | 14 DIA PC/RD | abc | def | xyz | gty | 4 | 1043419 | 2    | C | P112344, 169243                         |
| 238777 | 1198119585 | 14 DIA PC/RD | abc | def | xyz | gty | 4 | 1043428 | 5    | C | P112407, 111508, 104516, 115106, 161835 |
| 255210 | 2092139762 | 14 DIA PC/RD | abc | def | xyz | gty | 4 | 1043555 | 2    | C | P264856, 264863                         |
+--------+------------+--------------+-----+-----+-----+-----+---+---------+------+---+-----------------------------------------+

【讨论】:

  • 嗨,ZLK,这很有帮助。我真正想要的是所有预测都需要列出。预测表中有 5 个不同的 SKU。他们都需要从 AllProd 表中拿出来,我想提取产品详细信息。如果在预测中有所选项目的子 sku,我想只提取具有最高优先级的孩子。希望我能够澄清。
  • 我已更新查询以提供我认为您所要求的内容。如果“父”没有“子”,则只显示父。如果“父”有“子”,则显示具有最高 PPriority 的子。或者您是否正在寻找要显示的所有父母以及具有最高 Ppriority 的孩子(如果存在)?
  • 非常感谢。所以这让我得到了我需要的东西。
猜你喜欢
  • 2018-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-18
  • 1970-01-01
  • 2020-05-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多