[SQL] Помогите с запросом

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)
Помогите, пожалуйста, найти ошибку.

korsika

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

Andr163

(состоящих в браке в настоящее время)

katrin2201

А в твоем запросе тебя что не устраивает? По-моему, вполне подходит под твое условие.
Или ты тоже не знаешь, но знаешь, что ошибка есть? =)

korsika

ну а это не узнаешь. есть дата открытия брака только.

korsika

а там один человек может в нескольких браках быть?

Andr163

если есть несколько записей с 1 мужиком, последняя считается настоящей, иначе действительно никак :)

katrin2201

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

Ivan8209

order by date desc limit 1
---
"Математик может говорить, что ему хочется,
но физик должен, хотя бы в какой-то мере, быть в здравом рассудке."

Piskun

Мой запрос меня не устраивает тем, что я точно знаю, что он неверный. Был на собеседовании - привел такое решение, на следующий этап не прошел (все остальное было хорошо - предлагали запрос переписать, но нового вариант без row_number(partition by order by я не придумал).
К условию могу добавить только мое понимание: брак считается действующим, пока один из его участников не вступил в новый, то есть в настоящее время действуют те браки, у которых для каждого из супругов этот брак последний по времени.
И на всякий случай правильное решение:
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
Вот сижу и не пойму, где ошибся. На разных наборах данных возвращается одинаковый ответ..

zya369

правильное решение это они тебе прислали?
если да, то попроси набор данных, на которых твой вариант не сработает и втыкай :)

Piskun

Его я сам написал - ответили, типа правильно, а как на ANSI SQL. А ничего кроме первого скрипта не придумал

Alex28051973

Твой запрос и "правильный" выдадут разные ответы, например, если:
1) В таблице pairs есть 2 одинаковые записи для одного и того же последнего брака - твой запрос выдаст 2 записи, а "правильный" - одну
2) Также разные результаты будут, если например в один и тот же день был зарегистрирован брак с одним и тем же мужчиной, но разными женщинами. И эти браки для всех участников также последние. Твой запрос выдаст записи об обоих браках, а "правильный" - только об одном из них и т.д.

Piskun

1) Полное дублирование имеешь ввиду?
2) В таком случае и правильный запрос выдаст неправильный ответ, а случайный - я это в комментариях указал - хотя может и в этом дело..
Спасибо за комментарии!
Если кто придумает как без partition by order by запрос написать - напишите в этой теме, пожалуйста.

hwh2010

а "правильный" - только об одном из них
и о каком же? мне не кажется, что при приведённых тобой данных какой-либо ответ следует считать корректным.

hwh2010

Если кто придумает как без 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 не поддерживает их (или не поддерживал? я не слежу)
запрос без лимитов в подзапросах нада?

korsika

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

rosali

> Помогите, пожалуйста, найти ошибку
о, я нашел ошибку! не c.DATA а c.DATE! ^_^

zya369

касаемо 1-го пункта по умолчанию наверное считается, что все записи уникальны (типа как это в одно и то же время дважды жениться - по поределению невозможно)
кааемо 2-го - там же не сказано, что дата это день, так что по умолчанию там полное время и оно не совпадает по определению таблицы

Piskun

Если у мужчины два брака, то в настоящее время считается, что он в браке с той, где дата регистрации больше. Для женщин также. То есть после первого брака они могут во второй, третий вступать и так далее.

lubanj

а если был брак М1+Ж1, а после (через полгода) был брак М1+Ж2
то для Ж1 брак аннулируется?

Piskun

Да, если муж М1 заново вышел замуж, то для жены Ж1 брак заканчитвается. Тоже самое верно и для жены, я так думаю.

Gerkon

"Тяжелое" решение "в лоб"
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

Gerkon

А изначальный запрос неверно сработает например, на этом наборе:
М1 Ж1 20.07.2009
М1 Ж2 21.07.2009
М2 Ж1 22.07.2009
Не вернет актуальный брак М1 Ж2

Gerkon

Не, наврал, вернет :)
Не знаю, почему сказали, что запрос неверный

Piskun

Можно написать такого типа запросы (например, еще использовать id в pairs, хотя не факт ,что у более позднего брака оно больше) - но недостатков по сравнению с моим у них не больше не меньше - как ранее писали - при дубликатах в pairs и при одинаковой дате брака у одного человека они будут возвращать не совсем корректный ответ.
Оставить комментарий
Имя или ник:
Комментарий: