[SQL] Помогите с запросом
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
FROM hr.person a, hr.person b, hr.pairs c
WHERE a.ID = c.idg
AND b.ID = c.idm
(состоящих в браке в настоящее время)
А в твоем запросе тебя что не устраивает? По-моему, вполне подходит под твое условие.
Или ты тоже не знаешь, но знаешь, что ошибка есть? =)
Или ты тоже не знаешь, но знаешь, что ошибка есть? =)
ну а это не узнаешь. есть дата открытия брака только.
а там один человек может в нескольких браках быть?
если есть несколько записей с 1 мужиком, последняя считается настоящей, иначе действительно никак 

я так понимаю, что брак может закончиться тогда и только тогда, когда есть запись про новый брак одного из участников с более свежей датой
order by date desc limit 1
---
"Математик может говорить, что ему хочется,
но физик должен, хотя бы в какой-то мере, быть в здравом рассудке."
---
"Математик может говорить, что ему хочется,
но физик должен, хотя бы в какой-то мере, быть в здравом рассудке."
Мой запрос меня не устраивает тем, что я точно знаю, что он неверный. Был на собеседовании - привел такое решение, на следующий этап не прошел (все остальное было хорошо - предлагали запрос переписать, но нового вариант без 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
Вот сижу и не пойму, где ошибся. На разных наборах данных возвращается одинаковый ответ..
К условию могу добавить только мое понимание: брак считается действующим, пока один из его участников не вступил в новый, то есть в настоящее время действуют те браки, у которых для каждого из супругов этот брак последний по времени.
И на всякий случай правильное решение:
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) Также разные результаты будут, если например в один и тот же день был зарегистрирован брак с одним и тем же мужчиной, но разными женщинами. И эти браки для всех участников также последние. Твой запрос выдаст записи об обоих браках, а "правильный" - только об одном из них и т.д.
1) В таблице pairs есть 2 одинаковые записи для одного и того же последнего брака - твой запрос выдаст 2 записи, а "правильный" - одну
2) Также разные результаты будут, если например в один и тот же день был зарегистрирован брак с одним и тем же мужчиной, но разными женщинами. И эти браки для всех участников также последние. Твой запрос выдаст записи об обоих браках, а "правильный" - только об одном из них и т.д.
1) Полное дублирование имеешь ввиду?
2) В таком случае и правильный запрос выдаст неправильный ответ, а случайный - я это в комментариях указал - хотя может и в этом дело..
Спасибо за комментарии!
Если кто придумает как без partition by order by запрос написать - напишите в этой теме, пожалуйста.
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 не поддерживает их (или не поддерживал? я не слежу)
запрос без лимитов в подзапросах нада?
по поводу второго я всё-таки не понял что надо в ответе получить. если мужик женится 2 раза с разными женщинами, то для него брак последний зарегистрированный считать правильным?
если да а для женщин как? они обе попадают в выборку т.к. для них брак первый и последний.
если да а для женщин как? они обе попадают в выборку т.к. для них брак первый и последний.
> Помогите, пожалуйста, найти ошибку
о, я нашел ошибку! не c.DATA а c.DATE! ^_^
о, я нашел ошибку! не c.DATA а c.DATE! ^_^
касаемо 1-го пункта по умолчанию наверное считается, что все записи уникальны (типа как это в одно и то же время дважды жениться - по поределению невозможно)
кааемо 2-го - там же не сказано, что дата это день, так что по умолчанию там полное время и оно не совпадает по определению таблицы
кааемо 2-го - там же не сказано, что дата это день, так что по умолчанию там полное время и оно не совпадает по определению таблицы
Если у мужчины два брака, то в настоящее время считается, что он в браке с той, где дата регистрации больше. Для женщин также. То есть после первого брака они могут во второй, третий вступать и так далее.
а если был брак М1+Ж1, а после (через полгода) был брак М1+Ж2
то для Ж1 брак аннулируется?
то для Ж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
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
М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)
Помогите, пожалуйста, найти ошибку.