从一个表中选择与客户或另一表中的“ Customers”子项相关联的票证记录

埃克拉斯克

假设我有一个包含所有客户记录的表。
每个记录都有唯一的ID,名称和父记录ID。

(以防万一,父母可以有多个孩子,但孩子只能有一个父母。也没有祖父记录,因此父母可能没有父母,孩子可能没有孩子。)

顾客

+-----+------------+----------+
| ID  |    Name    | ParentID |
+-----+------------+----------+
| 100 | Customer A |          |
| 101 | Customer B |          |
| 102 | Customer C |      100 |
| 103 | Customer D |      100 |
| 104 | Customer E |      101 |
+-----+------------+----------+

从该示例中可以看到,我有5条唯一的客户记录,其中C和D是A的子级,E是B的子级。

现在,我有一个表格,其中包含这些客户筹集的所有票证。
每张票证都有一个唯一的ID,一个描述和一个父客户ID。

入场券

+-----+-------------+----------+
| ID  | Description | ParentID |
+-----+-------------+----------+
| 500 | Ticket A    |      100 |
| 501 | Ticket B    |      100 |
| 502 | Ticket C    |      102 |
| 503 | Ticket D    |      102 |
| 504 | Ticket E    |      103 |
| 505 | Ticket F    |      101 |
| 506 | Ticket G    |      104 |
| 507 | Ticket H    |      101 |
+-----+-------------+----------+

目标

  • 我将获得一个客户ID,并且需要选择属于该记录的所有故障单。
  • 如果记录中有孩子,我还需要属于这些记录的票证。
  • 如果记录是孩子,我对它的父母不感兴趣。

例子1

我得到的ID为100。这是客户A,有两个子代C和D。
根据我的选择,我期望以下结果:

  • 票证A-直接属于ID 100
  • 票证B-直接属于ID 100
  • 机票C-属于ID 102,一个100岁的孩子
  • 门票D-属于ID 102,一个100岁的孩子
  • 机票E-属于ID 103,一个100岁的孩子

例子2

我得到的ID是104。这是客户E,一个子记录。
作为我选择的结果,我期望以下几点:

  • 票证G-直接属于ID 104

我不希望任何进一步的信息,因为该记录是一个孩子,因此没有孩子,而且我不会抬头查看父记录。

我被困在那里...

获取属于一个ID的票证很容易:

SELECT
  tickets.Description

FROM
  Tickets AS tickets

LEFT JOIN
  Customers AS customers ON
  tickets.ParentID = customers.ID

WHERE
  customers.ID = 100

我卡住了孩子的票。

似乎我首先必须请求属于给定ID的Customer,然后获取ParentID与给定ID匹配的所有子Customer,然后最终请求属于任何这些记录的票证。

不幸的是,我还没有最清楚的主意,该从哪里着手并需要一些帮助。

如果相关,我正在使用SQL Server 2008 R2。

加雷斯

您可能需要使用递归公用表表达式来遍历祖先并获取所有相关记录:

DECLARE @CustomerID INT = 100;

-- SAMPLE DATA FOR CUSTOMERS
DECLARE @Customers TABLE (ID INT, Name VARCHAR(255), ParentID INT);
INSERT @Customers (ID, Name, ParentID)
VALUES
    (100, 'Customer A', NULL),
    (101, 'Customer B', NULL),
    (102, 'Customer C', 100),
    (103, 'Customer D', 100),
    (104, 'Customer E', 101);

-- SAMPLE DATA FOR TICKETS
DECLARE @Tickets TABLE (ID INT, Name VARCHAR(255), ParentID INT);
INSERT @Tickets (ID, Name, ParentID)
VALUES
    (500, 'Ticket A', 100),
    (501, 'Ticket B', 100),
    (502, 'Ticket C', 102),
    (503, 'Ticket D', 102),
    (504, 'Ticket E', 103),
    (505, 'Ticket F', 101),
    (506, 'Ticket G', 104),
    (507, 'Ticket H', 101);

-- USE RECURSIVE CTE TO LOOP THROUGH HIERARCHY AND GET ALL ANCESTORS
WITH RecursiveCustomers AS
(   SELECT  c.ID, c.Name, c.ParentID
    FROM    @Customers AS c
    UNION ALL
    SELECT  rc.ID, rc.Name, c.ParentID
    FROM    RecursiveCustomers AS rc
            INNER JOIN @Customers AS c 
                ON rc.ParentID = c.ID
)
SELECT  t.ID, t.Name, t.ParentID
FROM    @Tickets AS t
        INNER JOIN RecursiveCustomers AS rc
            ON rc.ID = t.ParentID
WHERE   rc.ParentID = @CustomerID OR (rc.ID = @CustomerID AND rc.ParentID IS NULL);

结果为100

+-----+-------------+----------+
| ID  | Description | ParentID |
+-----+-------------+----------+
| 500 | Ticket A    |      100 |
| 501 | Ticket B    |      100 |
| 502 | Ticket C    |      102 |
| 503 | Ticket D    |      102 |
| 504 | Ticket E    |      103 |
+-----+-------------+----------+

结果104

+-----+-------------+----------+
| ID  | Description | ParentID |
+-----+-------------+----------+
| 506 | Ticket G    |      104 |
+-----+-------------+----------+

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

从一个表中选择与SQL的另一个表中的相同值相关联的唯一行对

来自分类Dev

从一个表中选择记录,并使用另一表中的列对结果进行排序

来自分类Dev

如何从一个表中其ID出现在另一表的列中的表中过滤掉记录

来自分类Dev

从一个表中选择记录,而另一个表中没有两列

来自分类Dev

将记录插入到表中,其中一个来自另一表

来自分类Dev

如何从一个表中选择另一个表中没有外键的记录

来自分类Dev

从相关表中选择最后一个日期记录

来自分类Dev

如何从一个表中选择在另一表中由于某种条件而在另一表中不存在的所有记录?

来自分类Dev

如何从一个表中选择一条记录并计算出现在另一张表中的数目并对其进行计数

来自分类Dev

Oracle SQL从一个表中选择与另一个表相关的数据

来自分类Dev

在一个查询中从两个表中选择一个记录,并从另一个表中选择多个记录

来自分类Dev

从一个表中选择记录,然后从另一个表中选择一个记录数

来自分类Dev

SQL Server:从一个表中选择与层次结构相关的项目

来自分类Dev

如何将一个记录与同一表中的另一个记录相关联?

来自分类Dev

从基于另一个表的表中选择记录数Oracle

来自分类Dev

如何从一个表中其ID出现在另一表的列中的表中过滤掉记录

来自分类Dev

从一个表中选择每个类别下的最新20条记录

来自分类Dev

从一个表中选择记录,这些记录在另一个表中不存在

来自分类Dev

SQL查询从一个表中选择不在另一表中的行

来自分类Dev

SQL查询-从一个表中选择全部,在另一个表中匹配记录

来自分类Dev

如果在另一个表中找不到记录,则从一个表中选择

来自分类Dev

从一个表中选择所有记录并从另一个表中匹配记录

来自分类Dev

如何从一个表中选择不应存在其他记录的记录

来自分类Dev

如何将数据从一个 excel 界面(表 1)存储和更新到另一表(表 2)以跟踪交易历史记录?

来自分类Dev

按多列显示一个表中不在另一表中的记录

来自分类Dev

如何从一个表中选择另一个表中不存在的所有记录,但在不存在的记录中返回NULL

来自分类Dev

当另一个表的条件满足时如何从一个表中选择记录

来自分类Dev

如何在cakephp 3.6中从一个表中选择所有记录并从另一个表中选择一些记录

来自分类Dev

计算一个表中与另一表中条件匹配的记录

Related 相关文章

  1. 1

    从一个表中选择与SQL的另一个表中的相同值相关联的唯一行对

  2. 2

    从一个表中选择记录,并使用另一表中的列对结果进行排序

  3. 3

    如何从一个表中其ID出现在另一表的列中的表中过滤掉记录

  4. 4

    从一个表中选择记录,而另一个表中没有两列

  5. 5

    将记录插入到表中,其中一个来自另一表

  6. 6

    如何从一个表中选择另一个表中没有外键的记录

  7. 7

    从相关表中选择最后一个日期记录

  8. 8

    如何从一个表中选择在另一表中由于某种条件而在另一表中不存在的所有记录?

  9. 9

    如何从一个表中选择一条记录并计算出现在另一张表中的数目并对其进行计数

  10. 10

    Oracle SQL从一个表中选择与另一个表相关的数据

  11. 11

    在一个查询中从两个表中选择一个记录,并从另一个表中选择多个记录

  12. 12

    从一个表中选择记录,然后从另一个表中选择一个记录数

  13. 13

    SQL Server:从一个表中选择与层次结构相关的项目

  14. 14

    如何将一个记录与同一表中的另一个记录相关联?

  15. 15

    从基于另一个表的表中选择记录数Oracle

  16. 16

    如何从一个表中其ID出现在另一表的列中的表中过滤掉记录

  17. 17

    从一个表中选择每个类别下的最新20条记录

  18. 18

    从一个表中选择记录,这些记录在另一个表中不存在

  19. 19

    SQL查询从一个表中选择不在另一表中的行

  20. 20

    SQL查询-从一个表中选择全部,在另一个表中匹配记录

  21. 21

    如果在另一个表中找不到记录,则从一个表中选择

  22. 22

    从一个表中选择所有记录并从另一个表中匹配记录

  23. 23

    如何从一个表中选择不应存在其他记录的记录

  24. 24

    如何将数据从一个 excel 界面(表 1)存储和更新到另一表(表 2)以跟踪交易历史记录?

  25. 25

    按多列显示一个表中不在另一表中的记录

  26. 26

    如何从一个表中选择另一个表中不存在的所有记录,但在不存在的记录中返回NULL

  27. 27

    当另一个表的条件满足时如何从一个表中选择记录

  28. 28

    如何在cakephp 3.6中从一个表中选择所有记录并从另一个表中选择一些记录

  29. 29

    计算一个表中与另一表中条件匹配的记录

热门标签

归档