在一张表中进行自连接

3
 CustID       Name         ReferredBy
 1         Neeta Sayam  
 2         Dolly Dilly         1
 3         Meena Kimi          2

查找所有被他人推荐的客户的姓名。

输出应该是dolly dilly和meena kimi。

我已成功通过查询找到了推荐他人的客户。

 SELECT c1.name FROM Customer c1 JOIN Customer c2 ON c1.custid=c2. ReferredBy

请明确您预期的输出结果。 - JNK
2个回答

6
除非我漏掉了什么:
SELECT *
FROM Customer
WHERE ReferredBy IS NOT NULL

我认为OP的意思是在CustIDReferredBy之间创建一个关系。 - user596075
@Surfer513 - 嗯,那不是他说的话,而且这符合他想要的输出。 - JNK

1

有很多方法可以实现你想要的,但其中一个有趣的方法是使用CTE,因为它允许你按级别获取引用,例如在你的情况下,级别零将是没有引用的Neeta syam,级别一是dolly dillymeena kimi。以下查询将返回dolly dillymeena kimi,它们位于由where reference = 1指定的一级,如下所示:

WITH CTEs (Id, CustomerName, Reference, RefCustomer)
AS
(
  SELECT 
    Id,
    Name,
    0 As Reference, 
    CONVERT(VARCHAR(length), 'No Reference') AS RefCustomer 
  FROM Customers 
  WHERE ReferredBy IS NULL
  UNION ALL
  SELECT
    c.CustId,
    c.Name, 
    cs.Reference + 1, 
    cs.CustomerName 
  FROM Customers c 
  INNER JOIN Ctes cs ON c.ReferedBy = cs.Id
)
SELECT CustomerName, RefCustomer 
FROM Ctes 
WHERE Reference = 1;

由于您正在使用NAME进行连接,而这不是关系中使用的内容,因此无法按照编写的方式工作。我认为应该是INNER JOIN Ctes cs ON c.ReferedBy = cs.Id - JNK
在 union all 部分中,cs.CustomerName 被选为 RefCustomer。 - Mahmoud Gamal
你是正确的。我建议对一个 #temp 表运行它来测试。 - JNK

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接