2017-01-16 2 views
0

У меня есть две таблицы с именем User и ParentUser, что между ними существует одно-много отношений, а многие стороны - таблица ParentUser.Как установить, если на выбор для возврата выбрать в sql?

Я написал это отборное на User таблице:.

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

Теперь я хочу добавить еще один столбец, и *, содержащий 0 или 1,0 для пользователей, у которых есть дети в ParentUser и 1 для тех, кого DonT есть какие-либо.

Как с этим справиться?

Update

enter image description here

ответ

3

Вам нужно 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 
+0

Это не работает properly.One моих пользователей с именем А имеет несколько детей, но само по себе является потомком другого пользователя по имени B.Your запрос возвращает 0 для 1, но для B. –

+0

@HamidReza - вы можете добавить пример данных и ожидаемый результат –

+0

Я обновил вопрос. –

1
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; 
+0

Теперь я прочитал ваши комментарии. Хм, ваше описание проблемы полностью отличается от ваших комментариев. Мой ответ правильный, если вы хотите получить результат, описанный в вопросе. Но, по твоим комментариям ... его трудно понять, чего ты хочешь. Насколько я понимаю, вам нужна рекурсия. – Juozas

+0

Оба запроса работают исправно, но когда я использую второй запрос, он возвращает родительского пользователя. Мне нужны дети родителя в запросе 2. –

+0

Нет. Значение поля HasChildren для родителя и всегда равно 1.Я пишу еще один вопрос: http: //stackoverflow.com/questions/41672098/how-to-write-a-query-to-check-if-a-child-has-any-children-in-a-table –

0

Довольно легко определить каждого пользователя, у которого есть дети. Следующее начинается с определения количества детей, но в финальном выпуске (с другими столбцами от пользователя) просто сводится к следующему: «Есть ли дети?»

/************************* 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*/ 
     ) 
Смежные вопросы