从一个表中选择与客户关联的故障单记录或在另一个表

时间:2016-04-15 11:28:31

标签: sql select sql-server-2008-r2

假设我有一张包含我所有客户记录的表格 每条记录都有唯一的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,儿童记录 根据我的选择结果,我希望如下:

  • Ticket 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的客户,然后获取ParentID与给定ID匹配的所有子客户,然后最终请求属于任何这些记录的票证。

不幸的是,我不知道从哪里开始并需要一些帮助。

如果它与我有关,我正在使用SQL Server 2008 R2。

3 个答案:

答案 0 :(得分:1)

您可能需要使用recursive common table expression来遍历祖先并获取所有相关记录:

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

结果为100

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

结果为104

.accordion h3 .plus {
    content: "+";
}
.accordion h3 active .plus {
    content: "-";
}

答案 1 :(得分:0)

Select tickets.Description

FROM
  Tickets AS tickets
LEFT JOIN
 Customers  ON
 customers.ID= tickets.ParentID 
OR 
customers.ParentID =tickets.ParentID 
WHERE
  Tickets.ParentID = 100

答案 2 :(得分:0)

虽然GarethD提供的演示在演示中运行良好(起初我认为它对实时数据起作用)但我在实时数据中得到了奇怪的结果,其中属于父级的票据每次重复4次,尽管行相关孩子们只出现过一次。

由于我的无知以及无法修复上述问题,我使用了一种不同的方法,因此我认为我会把它留在这里作为替代方案。

首先,我选择父记录和子记录并将它们存储在表格中:

DECLARE @CUSTOMERS TABLE (
  ID BIGINT,
  PARENTID BIGINT,
  NAME VARCHAR(MAX)
)
INSERT INTO @CUSTOMERS(ID, PARENTID, NAME)
SELECT
  id,
  parent_id,
  name
FROM [customer_table]
WHERE id = '194' OR parent_id = '194';

现在我可以正常加入此表以选择正确的票证:

SELECT 
  customer.[NAME],
  ticket.[id],
  ticket.[description],

FROM [ticket_table] AS ticket

LEFT JOIN @CUSTOMERS AS customer
ON ticket.[id] = customer.[ID]

WHERE
  ticket.[id] = customer.[ID];

这会产生正确数量的门票,看起来足够快。希望它可以帮到某人。