假设我有一张包含我所有客户记录的表格 每条记录都有唯一的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 |
+-----+-------------+----------+
目标
示例1
我获得了ID 100.这是客户A,有两个孩子,C& D.
根据我的选择结果,我希望如下:
示例2
我给了ID 104.这是客户E,儿童记录 根据我的选择结果,我希望如下:
我不希望任何进一步的记录,因为记录是一个孩子,因此没有孩子,我不会向上看父母记录。
我被困的地方......
获取属于一个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。
答案 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];
这会产生正确数量的门票,看起来足够快。希望它可以帮到某人。