аа, сдаюсь
Sep. 29th, 2012 11:55 am![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
SQL-оведы, помогите. Нужно сделать запрос, где мне очень хочется вставить цикл, но ведь наверное нельзя?
Звучит просто: выбрать из таблицы с именами и фамилиями людей, у которых фамилия такая же как у кого-либо другого имя. Все идеи закончились, ничего не работает (в том числе по каким ключевым словам гуглить возможные решения).
Звучит просто: выбрать из таблицы с именами и фамилиями людей, у которых фамилия такая же как у кого-либо другого имя. Все идеи закончились, ничего не работает (в том числе по каким ключевым словам гуглить возможные решения).
no subject
Date: 2012-09-29 10:53 pm (UTC)у меня-то одна таблица :)
no subject
Date: 2012-09-29 11:02 pm (UTC)Если бы было две таблицы, ты бы писала:
select * from table1, table 2 where table1.id = table2.id
система грузит обе таблицы в память и гоняет алгоритм.
а так пишешь
select * from table as table1, table as table2
система грузит две таблицы в память, точно так же, но они одинаковые.
Это я очень поверхностно и нарочито упрощенно объясняю, конечно.
no subject
Date: 2012-09-29 11:17 pm (UTC)no subject
Date: 2012-09-29 11:35 pm (UTC)Представь, что тебе нужно решить задачу с одноименным отцом на бумаге.
(Вживемся в роль СУБД)
У тебя есть листок с таблицей
номер человека | ФИО | Дата рождения | Номер отца
Проблема в том, что ты можешь смотреть в один момент только на одну строчку таблицы. Зато можно заглядывать в другие таблицы, не забывая строчку из первой
Поэтому ты идешь к ксероксу и делаешь копию этого листа. Теперь у тебя две одинаковые копии одной таблицы. Ты помечаешь их как Тable1 и Тable2, чтобы не перепутать.
На этом этапе у нас есть запрос:
select * from table as table1, table as table2
Теперь можно приступить к решению непосредственно задачи.
Ты берешь первую строчку из первой таблицы и сравниваешь с каждой строчкой второй таблицы.
Что ты ищешь?
В первой таблице у нас сын, во второй таблице ты ищешь его отца.
Это означает, что ты берешь номер отца из первой таблицы и сравниваешь с просто номером из второй. Тебе подходят только пары, где эти два номера равны.
На этом этапе у нас есть запрос:
select * from table as table1, table as table2
WHERE table1.Father_Person_ID = table2.ID
Но в получившемся списке у тебя по-прежнему есть лишние пары!
Теперь при сравнении строчка-строчка ты проверяешь еще одно условие: имя отца и сына одинаковое.
Теперь у нас есть запрос
select * from table as table1, table as table2
WHERE table1.Father_Person_ID = table2.ID
AND table1.first name = table1.first name
Это и есть наш окончательный запрос.
Мы поставили AND, потому что нам нужно, чтобы оба условия выполнялись вместе.
И на всякий случай уточню: Тable1 и Тable2 - твои личные выдуманные пометки, ты могла их назвать sdgsdfgsdfgdsfg1 и gogogogog.
no subject
Date: 2012-09-29 11:50 pm (UTC)Спасибо большое.
А ты еще не спишь или уже не спишь? У вас там 2 ночи!
no subject
Date: 2012-09-30 12:35 am (UTC)SELECT * FROM `People` as `table1`, `People` as `table2` WHERE `table1`.`Father_Person_ID` = `table2`.`Person_ID`
AND `table1`.`First_Name` = `table1`.`First_name`;
возвращает мне список всех людей у которых есть отцы, так же как мой предыдущий запрос со вложенным select-ом, непонятно где собака зарыта. перепроверила все названия колонок :-/
no subject
Date: 2012-09-29 11:15 pm (UTC)