аа, сдаюсь
Sep. 29th, 2012 11:55 am![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
SQL-оведы, помогите. Нужно сделать запрос, где мне очень хочется вставить цикл, но ведь наверное нельзя?
Звучит просто: выбрать из таблицы с именами и фамилиями людей, у которых фамилия такая же как у кого-либо другого имя. Все идеи закончились, ничего не работает (в том числе по каким ключевым словам гуглить возможные решения).
Звучит просто: выбрать из таблицы с именами и фамилиями людей, у которых фамилия такая же как у кого-либо другого имя. Все идеи закончились, ничего не работает (в том числе по каким ключевым словам гуглить возможные решения).
no subject
Date: 2012-09-29 07:07 pm (UTC)может так (подзапрос в запросе)?
select * from tab where fam = (select nam from tab)
где поле "fam" должно быть по длинне равно "nam"
no subject
Date: 2012-09-29 07:12 pm (UTC):(
no subject
Date: 2012-09-29 07:34 pm (UTC)no subject
Date: 2012-09-29 07:36 pm (UTC)А я уж начала сомневаться, что вложенный запрос вообще имеет право а существование из-за текста ошибки.
no subject
Date: 2012-09-29 07:37 pm (UTC)no subject
Date: 2012-09-29 07:38 pm (UTC)no subject
Date: 2012-09-29 07:39 pm (UTC)no subject
Date: 2012-09-29 08:58 pm (UTC)Many times, a son has the same name as his father. (George Abbott had a son named George.) Find all such pairs, and list their names, the father's birth date, and the son's birth date.
Получается только выбрать всех, у кого в принципе есть отцы (father.person.id), а вот как смэтчить с именами отцов - не понимаю.
no subject
Date: 2012-09-29 10:51 pm (UTC)no subject
Date: 2012-09-29 10:52 pm (UTC)Person_ID
First_Name
Last_Name
...
Father_Person_ID
Mother_Person_ID
no subject
Date: 2012-09-29 11:06 pm (UTC)select t1.last_name, t1.first name, t1.dob "son dob", t2.dob "dad dob"
from Table t1, Table t2
where t1.father_person_id = t2.person_id
and t1.first_name = t2.first_name
no subject
Date: 2012-09-29 07:38 pm (UTC)from Table as t1
inner join Table as t2 --this is the same table
on t1.LastName=t2.FirstName
no subject
Date: 2012-09-29 08:59 pm (UTC)no subject
Date: 2012-09-29 10:50 pm (UTC)"join" is not something stable, it's a way for SQL to match one set of records with the other.
You use inner join when you want all records from one table and only matching records from the other one.
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)no subject
Date: 2012-09-29 11:16 pm (UTC)no subject
Date: 2012-09-29 11:18 pm (UTC)normally I just use = for regular join.
I do remember that's slightly different in Oracle and SQL server, but don't remember which one is which.
no subject
Date: 2012-09-30 02:21 pm (UTC)no subject
Date: 2012-09-29 11:10 pm (UTC)in this case you view one table as two.
no subject
Date: 2012-09-29 10:26 pm (UTC)no subject
Date: 2012-09-29 10:49 pm (UTC)no subject
Date: 2012-09-30 05:11 am (UTC)no subject
Date: 2012-09-30 05:21 am (UTC)no subject
Date: 2012-09-30 10:43 am (UTC)no subject
Date: 2012-09-30 05:14 pm (UTC)Книга Database Processing автор David Kroenke. Про Joins речь идет во второй главе, но именно в аспекте поиска по двум и более таблицам, остальное по join должно быть в 7 главе, которую нам пока не задавали :)
Выбор конкретной СУБД оставили на наше усмотрение, я выбрала MySQL поскольку работала с ним раньше.
no subject
Date: 2012-10-01 01:06 am (UTC)