Мне нужны все билеты, в которых все связанные записи с детьми закрыты. Поэтому, если один из детей - это что-то еще, я не хочу, чтобы билет в результирующем наборе.найти только родительские записи с детьми определенного статуса на нескольких таблицах
Я пробовал это, используя 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 (так как он имеет один ребенок закрыт) Я немного озадачен, как правильно это решить.
Это отличное место для начала. http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/ –
Я добавил sqlfiddle с образцами данных – Jeroen
Это для mysql или sql-сервера ? Ваша скрипка - mysql, но вы отметили ее как sqlserver. –