2016-06-28 42 views
0

我有一个为所有具有范围项的父/子类型项目构建的层次结构(临时表)。我有一个表(LastOrdr),它具有所有项目的最后一个订单日期(不管父/子)。然后我有所有物品的主物品表。SQL为每个父项/子项目系列选择一个日期范围

我有一个查询,选择符合某个lastorderdate标准的所有非父/子项目。这是一个简单的查询,它将主项目表与LastOrdr表连接起来,从提供的用户参数中获取max(lastorderdate)。

我的挑战是对父母/孩子的产品也做同样的事情。对于父母/子女的物品(一个家长,最多可以有8个孩子,但大多数情况下可以有2/3)。选择是,对于一个家庭来说,max(lastorderdate)必须应用于整个家庭。我的意思是,如果我有一个父母的3个孩子,我需要从LastOrdr.lastorderdate中找到这个家庭中所有4个(1父母和3个孩子)项目的最大值,然后将其与用户提供的参数进行比较。如果它符合作为一个家庭的标准,我想选择那个家庭,否则,丢弃它。

一些指导,实现这一点将不胜感激。

谢谢。

表1(主项):

itemID ParentID Descrip ...... 
21   2   ..... 
22   2   ..... 
23   2   ..... 
24   2   ..... 
27   3   ..... 
29   3   ..... 
33   3   ..... 
41   3   ..... 
...................... 

表2(LastOrdr):

ItemID lastorderdate 
2   2014-01-01 
21   2014-07-21 
21   2015-01-12 
22   2013-01-01 
23   2014-04-01 
27   2013-01-23 
........................... 

回答

1

下面的查询返回你想要什么。

declare @master table (itemID int, ParentID int) 
insert @master values 
(21   ,2), 
(22   ,2), 
(23   ,2), 
(24   ,2), 
(27   ,3), 
(29   ,3), 
(33   ,3), 
(41   ,3), 
(2, 2), --I added this data 
(3, 2) -- 
--,(44,21) --if you wish grandchild 

declare @LastOrdr table(ItemID int, lastorderdate date) 
insert @LastOrdr values 
(2   ,'2014-01-01'), 
(21   ,'2014-07-21'), 
(21   ,'2015-01-12'), 
(22   ,'2013-01-01'), 
(23   ,'2014-04-01'), 
(27   ,'2013-01-23') 
--,(44, '2015-04-15') --grandchild's order 

;with master as (--create recursive (hierarchical) CTE 
--anchor query: items w/out parents 
select itemid, itemid ParentID --fix value 
from @master where ParentID = itemId --parent to itsellf 
union all 
--recursive query down the tree 
select m.itemid, m1.ParentID 
from @master m 
inner join master m1 on m.ParentID=m1.itemID 
)--end CTE 
select m.ParentID, max(lo.lastorderdate) lastorderdate 
from master m 
inner join @LastOrdr lo on m.itemID=lo.ItemID --join by childId 
where lo.lastorderdate< '2015-05-29' -- use ISO date 
group by m.ParentID --group by parent 
+0

Alex,谢谢你的回应。在master中,对于父记录,我有parentID = 2以及itemID = 2。父母不为空。你会做出什么样的改变来适应你的查询? – Eclipse

+0

查看更新回答 –

+0

我喜欢这样一个事实,即它只返回符合条件的家庭的父记录。如果数据是正确的,我可以使用parentid来选择每个家庭中的所有孩子。另外,我需要提供一个where子句,所以我添加了“...from master m where lastorderdate <'05 -29-2015' group by m.Parent_ID“对你来说看起来合适吗? – Eclipse

1

你没有张贴任何表结构,所以我只是给我的一般做法。 首先,我将通过创建一个额外的列来识别分组,从而将父母和孩子分组。我会UNION的父母和孩子,与额外的列parentId

itemId | parentId 
1  | 1 
2  | 1 
7  | 1 
9  | 1 
3  | 3 
6  | 3 

在这里,您可以GROUP BY parentId得到MAX(lastorderdate)。如果您发布表结构,我可以更详细。

尝试下面的查询:

SELECT * 
FROM (
    SELECT a.ParentID, MAX(orderdate) AS 'LatestOrder' 
    FROM table1 a 
    JOIN Table2 b ON b.ItemID = a.ItemID 
    GROUP BY ParentID 
) c 
JOIN table2 d ON d.OrderDate = c.LatestOrder 
JOIN table1 e ON e.ItemId = d.ItemId AND e.ParentId = c.ParentID 
+0

增加了一些表结构。正如我在原文中提到的那样,我也建立了P/C层次结构。你可以看到我已经有一个parentID字段。你可以在伪选择语句中显示你的方法吗? – Eclipse

+0

Item是父级时是否为'ParentId' NULL? – Eric

+0

否,对于项目表中的父行,itemid = 2 parentID = 2。 – Eclipse

相关问题