【问题标题】:Recursive many-to-many CTE递归多对多 CTE
【发布时间】:2017-12-04 06:55:13
【问题描述】:

我不是数据库专家,我试图为 sql server 2012 的以下场景编写 cte,但无法解决我的问题。感谢有人帮助我解决这个问题。

我有一个名为 Jockcard2Item 的多对多表,用于表 Jobcard 和 items。

工作卡可能有多个项目,项目可以有多个工作卡,

在我的情况下,我想找出给定项目 id 的所有工作卡,如下所示。

  • jobcard1 有第 1 项,第 2 项。
  • jobcard2 有第 2 项,第 3 项
  • jobards3 有项目 3
  • jobcard4 有项目 4

我想获取与给定项目关联的所有工作卡,如果还有其他 引用相同工作卡的项目(如 jobcard2 引用 item2) 也想包含该工作卡。

结果应该返回 jobcard1,jobcard3,jobcard3,

我正在尝试使用以下无限运行的查询。

DECLARE @itemId int
SELECT @itemId = 12

;WITH temp as(
    SELECT jobCard_ID, item_id FROM Jobcard2Item
    WHERE item_id = @EstimateID

    UNION ALL

    SELECT bi.jobCard_ID ,bi.item_id  FROM Jobcard2Item
    JOIN temp x ON bi.jobCard_ID= x.jobCard_ID where x.item_id  not IN (bi.item_id )
)

select * from temp option (maxrecursion 0)

示例日期如下

id    jobcard_ID, item_ID
1     512         12
2     512         13
3     513         13
4     513         14
5     514         14
6     515         15
7     516         16

当我将 12 作为 item_ID 传递时,它应该返回结果 - 512,513,514,

【问题讨论】:

  • 提供样本数据会有很大帮助。
  • 刚刚添加了示例数据。你能看看吗。

标签: sql sql-server common-table-expression recursive-query


【解决方案1】:

这个查询应该有帮助:

select distinct A.jobcard_id from Jockcard2Item A join Jockcard2Item B
on A.jobcard_id = B.jobcard_id or A.item_id = B.item_id
where A.item_id <> B.item_id or A.jobcard_id <> B.jobcard_id

它不需要CTE(我试过了,但我认为这是不可能的)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-20
    • 1970-01-01
    • 2020-03-30
    • 2019-02-17
    • 1970-01-01
    • 2010-10-24
    相关资源
    最近更新 更多