2015-10-28 1 views
0

Мне нужны все билеты, в которых все связанные записи с детьми закрыты. Поэтому, если один из детей - это что-то еще, я не хочу, чтобы билет в результирующем наборе.найти только родительские записи с детьми определенного статуса на нескольких таблицах

Я пробовал это, используя antijoin patern, но моя проблема в том, что дети живут в разных столах.

смотрите этот http://sqlfiddle.com/#!3/febde/8 для примера

t1: билет t2: relatedrecord t3: child1 t4: child1

select ticket.ticketid, rr.relatedrecordkey, rr.relatedrecordclass, c1.id, c1.status, c2.id, c2.status 
from ticket 
inner join relatedrecord rr on rr.recordkey = ticket.ticketid and rr.class = ticket.class 
left join child1 c1 on c1.id = rr.relatedreckey and c1.class = rr.relatedrecclass 
left join child2 c2 on c2.id = rr.relatedreckey and c2.class = rr.relatedrecclass 

результаты:

+----------+--------+-----------+-------+-----------------+---------------+--------+--------+--------+--------+ 
| ticketid | status | RECORDKEY | class | RELATEDRECCLASS | relatedreckey | id | status | id | status | 
+----------+--------+-----------+-------+-----------------+---------------+--------+--------+--------+--------+ 
|  1183 | NEW |  1183 | SR | WORKORDER  |   1238 | 1238 | NEW | (null) | (null) | 
|  1183 | NEW |  1183 | SR | SR    |   1184 | (null) | (null) | 1184 | NEW | 
|  1185 | NEW |  1185 | SR | WORKORDER  |   1239 | 1239 | CLOSE | (null) | (null) | 
|  1185 | NEW |  1185 | SR | SR    |   1186 | (null) | (null) | 1186 | CLOSE | 
|  1187 | NEW |  1187 | SR | WORKORDER  |   1240 | 1240 | CLOSE | (null) | (null) | 
|  1187 | NEW |  1187 | SR | SR    |   1188 | (null) | (null) | 1188 | NEW | 
|  1190 | NEW |  1190 | SR | SR    |   1191 | (null) | (null) | 1191 | CLOSE | 
|  1192 | NEW |  1192 | SR | WORKORDER  |   1241 | 1241 | CLOSE | (null) | (null) | 
+----------+--------+-----------+-------+-----------------+---------------+--------+--------+--------+--------+ 

так

  • билет 1183 имеет две связанные записи, оба не закрыты. (отклонение)
  • билет 1185 имеет две связанные записи, оба они закрыты (принято)
  • билет 1187 имеет две связанные записи, один новый, один закрыт. (Отклонить)
  • билет 1190 имеет одну родственную запись, которая закрыта (принять)
  • билет 1192 имеет один связанной записи (другую таблицу), который закрыт (принять)
  • билет 1189 имеет не связанных записей (отклонить)

Из этого набора я хочу видеть билет 1185, 1190, 1192 в наборе результатов. он должен выглядеть следующим образом:

+----------+--------+-----------+-------+-----------------+---------------+--------+--------+--------+--------+ 
| ticketid | status | RECORDKEY | class | RELATEDRECCLASS | relatedreckey | id | status | id | status | 
+----------+--------+-----------+-------+-----------------+---------------+--------+--------+--------+--------+ 
|  1185 | NEW |  1185 | SR | WORKORDER  |   1239 | 1239 | CLOSE | (null) | (null) | 
|  1185 | NEW |  1185 | SR | SR    |   1186 | (null) | (null) | 1186 | CLOSE | 
|  1190 | NEW |  1190 | SR | SR    |   1191 | (null) | (null) | 1191 | CLOSE | 
|  1192 | NEW |  1192 | SR | WORKORDER  |   1241 | 1241 | CLOSE | (null) | (null) | 
+----------+--------+-----------+-------+-----------------+---------------+--------+--------+--------+--------+ 

Я пытался что-то вроде:

select ticket.ticketid, rr.relatedrecordkey, rr.relatedrecordclass, c1.id, c1.status, c2.id, c2.status 
from ticket 
inner join relatedrecord rr on rr.recordkey = ticket.ticketid and rr.class = ticket.class 
where not exists (
    select 1 from child1 c1 
    where c1.id = rr.relatedreckey and c1.class = rr.relatedrecclass 
    and c1.status <> 'CLOSE' 
) and not exists (
    select 1 from child2 c2 
    where c2.id = rr.relatedreckey and c2.class = rr.relatedrecclass 
    and c2.status <> 'CLOSE' 
) 

Это приводит к двум линиям для ticket2 И один из билета 3 (так как он имеет один ребенок закрыт) Я немного озадачен, как правильно это решить.

+1

Это отличное место для начала. http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/ –

+0

Я добавил sqlfiddle с образцами данных – Jeroen

+0

Это для mysql или sql-сервера ? Ваша скрипка - mysql, но вы отметили ее как sqlserver. –

ответ

0

Я нашел рабочий ответ.

Смотрите эту sqlfiddle: http://sqlfiddle.com/#!3/febde/24

SELECT ticket.ticketid, 
    count(rr.relatedreckey) AS children, 
    count(wo.id) AS wo, 
    count(tt.id) AS sr 
FROM ticket 
INNER JOIN relatedrecord rr ON rr.recordkey = ticket.ticketid 
AND rr.class = ticket.class 
LEFT JOIN child1 wo ON wo.id = rr.relatedreckey 
AND wo.class = rr.relatedrecclass 
AND wo.status = 'CLOSE' 
LEFT JOIN child2 tt ON tt.id = rr.relatedreckey 
AND tt.class = rr.relatedrecclass 
AND tt.status = 'CLOSE' 
GROUP BY ticket.ticketid 
HAVING (count(wo.id) + count(tt.id)) = count(rr.relatedreckey); 

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

0

Все еще не полностью уверен, что вы хотите получить результаты, но я думаю, что это может быть так.

select * 
from 
(
    select t.ticketid 
    from ticket t 
    join relatedrecord rr on rr.recordkey = t.ticketid and rr.class = t.class 
    join child1 c1 on c1.id = rr.relatedreckey 
     and c1.class = rr.relatedrecclass 
     and c1.status = 'CLOSE' 
    group by t.ticketid 
    having MAX(c1.status) = MIN(c1.status) 
    UNION ALL 
    select t.ticketid 
    from ticket t 
    join relatedrecord rr on rr.recordkey = t.ticketid and rr.class = t.class 
    join child2 c2 on c2.id = rr.relatedreckey 
     and c2.class = rr.relatedrecclass 
     and c2.status = 'CLOSE' 
    group by t.ticketid 
    having MAX(c2.status) = MIN(c2.status) 
) x 
group by ticketid 
+0

нет, это неправильное. В нем также будут показаны билеты, в которых есть как закрытые дети, так и дети другого статуса. В этом случае он будет содержать 1187, что неверно. http://sqlfiddle.com/#!3/febde/7 – Jeroen

+0

Я обновил сообщение с помощью набора результатов, который я хочу получить от этих данных. – Jeroen

+0

Правильно, но объяснение ПОЧЕМУ - это то, что мне нужно. Я догадываюсь о правилах ведения бизнеса. –

Смежные вопросы