【问题标题】:How to write a query to check if a child has any children in a table如何编写查询以检查孩子是否在表中有任何孩子
【发布时间】:2017-05-31 00:55:08
【问题描述】:

我有两个名为 UserParentUser 的表,它们之间存在一对多关系,而多方是 ParentUser 表。

我想写一个查询来传递一个 parentId 并获取它的所有孩子和一个列名HasChildren 来查看每个孩子是否有孩子。

下图显示了一些示例数据和需要的结果:

尝试:

1-By Prdp

SELECT u.*,
       CASE
         WHEN p.ParentId IS NULL THEN 1
         ELSE 0
       END as HasChildren
FROM   [User] u
       LEFT JOIN (select distinct ParentId from ParentUser) p
              ON u.UserId = p.ParentId

这里一切正常,但我不能将 parentId 传递给它。

2- Juozas

DECLARE @ParentId INT = 2441;

SELECT DISTINCT
     [UserId]       =   [u].[userid]
    ,[HasChildren]  =   CAST(ISNULL([pu].[userid], 0) AS BIT)
    ,[ChildrenId]   =   [pu].[userid]
FROM
    [user]  AS  [u]
OUTER APPLY
    (
        SELECT [userid], [parentid] FROM [ParentUser] WHERE [parentid] = [u].[userid]
    )       AS  [pu]
WHERE
        [pu].[parentid] = @ParentId;

一切正常,但 HasChildren 字段的值始终为 1。

【问题讨论】:

  • 你能分享一下你到目前为止尝试过的查询吗?
  • 你为什么不让我们知道以前有人问过这个问题?
  • @CraigYoung 你在评论中提到的问题也是我的问题,但由于它有一些误解,我决定再做一个。
  • @HamidReza 我知道另一个也是你的问题。这个问题只需要在您的第一个问题的解决方案的结果中添加一个简单的过滤器。我在证明这一点的问题中添加了answer

标签: sql sql-server tsql sqlcommand


【解决方案1】:
SELECT UserId, HasChildren = CASE WHEN EXISTS(SELECT 1 FROM ParentUser pu2
                                              WHERE pu2.ParentId = pu.UserId)
                             THEN 1 ELSE 0 END
FROM ParentUser pu
WHERE ParentId = @ParentId
ORDER BY UserId

【讨论】:

    猜你喜欢
    • 2017-03-19
    • 2017-10-24
    • 2023-03-12
    • 1970-01-01
    • 2017-03-14
    • 2016-09-18
    • 1970-01-01
    • 1970-01-01
    • 2019-04-11
    相关资源
    最近更新 更多