[SQL] Помогите с запросом
FROM hr.person a, hr.person b, hr.pairs c
WHERE a.ID = c.idg
AND b.ID = c.idm
(состоящих в браке в настоящее время)
Или ты тоже не знаешь, но знаешь, что ошибка есть? =)
ну а это не узнаешь. есть дата открытия брака только.
а там один человек может в нескольких браках быть?
если есть несколько записей с 1 мужиком, последняя считается настоящей, иначе действительно никак
я так понимаю, что брак может закончиться тогда и только тогда, когда есть запись про новый брак одного из участников с более свежей датой
---
"Математик может говорить, что ему хочется,
но физик должен, хотя бы в какой-то мере, быть в здравом рассудке."
К условию могу добавить только мое понимание: брак считается действующим, пока один из его участников не вступил в новый, то есть в настоящее время действуют те браки, у которых для каждого из супругов этот брак последний по времени.
И на всякий случай правильное решение:
SELECT b.fio,c.fio, a.data
FROM (SELECT idg,idf, DATA,
ROW_NUMBER OVER (PARTITION BY idm ORDER BY DATA DESC)
n1,
ROW_NUMBER OVER (PARTITION BY idg ORDER BY DATA DESC)
n2
FROM hr.pairs
) a, hr.person b, hr.person c
WHERE n1 * n2 = 1 AND a.idg = b.ID AND a.idm = c.ID
Вот сижу и не пойму, где ошибся. На разных наборах данных возвращается одинаковый ответ..
если да, то попроси набор данных, на которых твой вариант не сработает и втыкай
Его я сам написал - ответили, типа правильно, а как на ANSI SQL. А ничего кроме первого скрипта не придумал
1) В таблице pairs есть 2 одинаковые записи для одного и того же последнего брака - твой запрос выдаст 2 записи, а "правильный" - одну
2) Также разные результаты будут, если например в один и тот же день был зарегистрирован брак с одним и тем же мужчиной, но разными женщинами. И эти браки для всех участников также последние. Твой запрос выдаст записи об обоих браках, а "правильный" - только об одном из них и т.д.
2) В таком случае и правильный запрос выдаст неправильный ответ, а случайный - я это в комментариях указал - хотя может и в этом дело..
Спасибо за комментарии!
Если кто придумает как без partition by order by запрос написать - напишите в этой теме, пожалуйста.
а "правильный" - только об одном из нихи о каком же? мне не кажется, что при приведённых тобой данных какой-либо ответ следует считать корректным.
Если кто придумает как без partition by order by запрос написать - напишите в этой теме, пожалуйста.SELECT a.fio, b.fio, c.DATA
FROM hr.person a, hr.person b, hr.pairs c
WHERE a.ID = c.idg
AND b.ID = c.idm
AND c.ID = (SELECT ID
FROM hr.pairs
WHERE idm = c.idm OR idg = c.idg order by date desc limit 1)
но я не уверен, что вложенные запросы с лимитом входят в стандарт. и вроде mysql не поддерживает их (или не поддерживал? я не слежу)
запрос без лимитов в подзапросах нада?
если да а для женщин как? они обе попадают в выборку т.к. для них брак первый и последний.
о, я нашел ошибку! не c.DATA а c.DATE! ^_^
кааемо 2-го - там же не сказано, что дата это день, так что по умолчанию там полное время и оно не совпадает по определению таблицы
Если у мужчины два брака, то в настоящее время считается, что он в браке с той, где дата регистрации больше. Для женщин также. То есть после первого брака они могут во второй, третий вступать и так далее.
то для Ж1 брак аннулируется?
Да, если муж М1 заново вышел замуж, то для жены Ж1 брак заканчитвается. Тоже самое верно и для жены, я так думаю.
SELECT a.fio, b.fio, c.DATA
FROM hr.person a,
hr.person b,
(SELECT p.idg, p.idm, p.DATA
FROM pairs p
WHERE NOT EXISTS (SELECT *
FROM pairs x
WHERE x.idg = p.idg AND x.DATA > p.DATA)
AND NOT EXISTS (SELECT *
FROM pairs y
WHERE y.idm = p.idm AND y.DATA > p.DATA c
WHERE a.ID = c.idg
AND b.ID = c.idm
М1 Ж1 20.07.2009
М1 Ж2 21.07.2009
М2 Ж1 22.07.2009
Не вернет актуальный брак М1 Ж2
Не знаю, почему сказали, что запрос неверный
Можно написать такого типа запросы (например, еще использовать id в pairs, хотя не факт ,что у более позднего брака оно больше) - но недостатков по сравнению с моим у них не больше не меньше - как ранее писали - при дубликатах в pairs и при одинаковой дате брака у одного человека они будут возвращать не совсем корректный ответ.
Оставить комментарий
Piskun
Имеются две таблицы: таблица супружеских пар (Pairs) и таблица людей (Person).Таблица Pairs содержит записи о супружеских парах. Таблица Person содержит атрибуты человека. Люди, имеющие отражение в таблице Person, могут быть женаты один и более раз. Количество записей в таблицах не ограничено.
Структура таблицы Pairs
ID – Идентификатор пары
IDG – Идентификатор мужа
IDM – Идентификатор жены
Date – Дата регистрации брака
Структура таблицы Person
ID – идентификатор человека
FIO – ФИО человека
Задание
Вывести список супружеских пар (состоящих в браке в настоящее время) с ФИО мужа и жены с указанием даты регистрации брака.
Вот мой вариант решения:
SELECT a.fio, b.fio, c.DATA
FROM hr.person a, hr.person b, hr.pairs c
WHERE a.ID = c.idg
AND b.ID = c.idm
AND c.DATA = (SELECT MAX (DATA)
FROM hr.pairs
WHERE idm = c.idm OR idg = c.idg)
Помогите, пожалуйста, найти ошибку.