2013-03-27 4 views
2

Я хочу знать, все ли объединенные значения находятся в другой таблице.Группа + все в ...?

Пример:

id childId 
1 2 
1 3 
1 4 
2 6 
2 7 
2 8 
2 9 

childIds 
2 
3 
4 
6 
7 



**desired result:** 

id allChildrenInChildIds 
1 True 
2 False 

Что бы лучший способ сделать это?

ответ

1

SQL Fiddle DEMO


select id, case when sum(TrueorFalse) = count(1) then 'true' 
       else 'false' end 
from (
select id, case when exists (select 1 from ChildIDs where id = childid) then 1 
      else 0 
      end as TrueOrFalse 
from child) A 
group by A.id 

Использование Когда Exists (выберите ... от ...)

+0

это один, казалось бы, самый простой для понимания и производства желаемого результата ... благодаря! – Vigrond

1

Если запустить этот запрос

SELECT id, GROUP_CONCAT(childId) 
FROM table 
WHERE childId NOT IN (2,3,4,5,6,7,8) 
GROUP BY id 

любые идеи, в результате будет ложным. Я добавил GROUP_CONCAT, чтобы вы могли определить, какие дочерние элементы не были в наборе. Если идентификатор отсутствует в результатах, это верно.

+0

NOT IN (2,3,4,5,6,7,8) Может также быть NOT IN (SELECT ID FROM childIds) – miah

1

Попробуйте

SELECT 
    ID 
    ,MIN(allChildrenInChildIds) 
FROM 
(
    SELECT id, 
    CASE WHEN childId IN (SELECT childIds FROM Table2) THEN 'TRUE' ELSE 'FALSE' 
    END AS allChildrenInChildIds 
    FROM Table1 
) result 
GROUP BY ID 
1

Что-то вроде этого?

select 
    id, 
    case when exists (
    select c.childid 
    from Child as c 
    where c.id = ids.id 
    and not exists (
     select * 
     from Childids 
     where c.childid = Childids.id 
    )) then 'No' else 'Yes' end as WereAllChildrenFound 
from ids 
1

Как насчет этого?


select id , case when count(c.childid) <> count(ci.childid) then 'false' else 'true' end as allChildrenInChildIds 
from Child c 
left join ChildIds ci 
on c.childid = ci.childid 
group by id 
Смежные вопросы