【问题标题】:How to set an if on a select for returning select in sql?如何在选择上设置if以在sql中返回选择?
【发布时间】:2017-01-16 05:26:38
【问题描述】:

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

我已经在User 表上写了这个选择:

select u.* from [User] u inner join ParentUser p on u.UserId=p.UserId where p.ParentId=2440

现在我想在 u 中添加另一列。* 包含 0 或 1.0 的用户是在 ParentUser 有孩子的用户,而 1 是没有孩子的用户。

如何处理?

更新

【问题讨论】:

    标签: sql sql-server sqlcommand


    【解决方案1】:

    你需要LEFT JOIN

    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
                      WHERE  ParentId IN (SELECT UserId
                                          FROM   ParentUser
                                          WHERE  parentId = 2440)) p
                  ON u.UserId = p.ParentId 
    

    【讨论】:

    • 这不能正常工作。我的一个名为 A 的用户有一些孩子,但它本身是另一个名为 B 的用户的孩子。您的查询为 A 返回 0,而为 B 返回 1。
    • @HamidReza - 你能添加样本数据和预期结果吗
    • 正确,但是如何传递 ParentId 来获取特定用户的孩子?
    • @HamidReza - 在 where 子句中传递 ParentId。更新
    • 抱歉,这个 where 子句返回父记录。我想要它的所有子记录。
    【解决方案2】:
    SELECT DISTINCT
         [UserId]       =   [u].[userid]
        ,[HasChildren]  =   CAST(ISNULL([pu].[userid], 0) AS BIT)
    FROM
        [User]  AS  [u]
    OUTER APPLY
        (
            SELECT [userid] FROM [ParentUser] WHERE [parentid] = [u].[userid]
        )       AS  [pu];
    

    而且,如果您想按父 ID 过滤:

     DECLARE @ParentId INT = 2;
    
    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;
    

    【讨论】:

    • 现在我阅读了您的 cmets。嗯,您的问题描述与您的 cmets 完全不同。我的回答是正确的,如果你想得到结果,请在问题中描述。但是,通过你的cmets......很难理解你想要什么。据我了解,您需要在这里递归。
    • 两个查询都正常工作,但是当我使用第二个查询时,它返回父用户。我需要查询 2 中父用户的孩子。
    • 否。HasChildren 字段的值是针对父级的,始终设置为 1。我在这里写另一个问题:stackoverflow.com/questions/41672098/…
    【解决方案3】:

    确定每个有孩子的用户是相当容易的。下面从确定孩子的数量开始,但在最终输出中(与用户的其他列)简单地将其简化为:“有孩子吗?”

    /************************* Set up sample data *************************/
    declare @User table (
        UserId int,
        UserName varchar(10)
    )
    insert @User
    select 1, 'A' union all
    select 2, 'B' union all
    select 3, 'C'
    
    declare @ParentUser table (
        UserId int,
        ParentId int
    )
    insert @ParentUser
    select 3, 1 union all
    select 3, 2 union all
    select 2, 1
    
    
    /****************************** Solution ******************************/
    ;with ChildCounts as (
        select  p.ParentId, COUNT(*) as ChildCount
        from    @ParentUser p
        group by p.ParentId
    ), UsersWithHasChildren as (
        select  u.*,
                case
                    when p.ChildCount > 0 then 1
                    else 0
                end as HasChildren
        from    @User u
                left join ChildCounts p on
                    p.ParentId = u.UserId
    )
    select  *
    from    UsersWithHasChildren u
    

    根据您的重复问题,确定特定父母的哪些孩子也有孩子的特殊情况是一个琐碎的WHERE 过滤器,如下所示。

    where   u.UserId in (
                select  p.UserId
                from    @ParentUser p
                where   p.ParentId = 1 /*Parametrise this value*/
            )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-03
      • 2021-10-01
      • 1970-01-01
      • 2020-09-28
      • 1970-01-01
      相关资源
      最近更新 更多