3eta: (Default)
[personal profile] 3eta
SQL-оведы, помогите. Нужно сделать запрос, где мне очень хочется вставить цикл, но ведь наверное нельзя?
Звучит просто: выбрать из таблицы с именами и фамилиями людей, у которых фамилия такая же как у кого-либо другого имя. Все идеи закончились, ничего не работает (в том числе по каким ключевым словам гуглить возможные решения).

Date: 2012-09-29 10:53 pm (UTC)
From: [identity profile] 3eta.livejournal.com
то есть когда надо обработать одну таблицу как две разных? запуталась.
у меня-то одна таблица :)

Date: 2012-09-29 11:02 pm (UTC)
From: [identity profile] jgofri.livejournal.com
Я не уверена, что ты называешь "обработать", но система создаст в памяти, если я правильно помню, две отдельные временные таблицы
Если бы было две таблицы, ты бы писала:

select * from table1, table 2 where table1.id = table2.id
система грузит обе таблицы в память и гоняет алгоритм.

а так пишешь
select * from table as table1, table as table2
система грузит две таблицы в память, точно так же, но они одинаковые.

Это я очень поверхностно и нарочито упрощенно объясняю, конечно.

Date: 2012-09-29 11:17 pm (UTC)
From: [identity profile] 3eta.livejournal.com
спасибо! мне как раз поверхностно и не хватает, потому что я могу скопировать и применить чужой запрос, но мне бы понять принцип - как оно работает и почему стоит именно так

Date: 2012-09-29 11:35 pm (UTC)
From: [identity profile] machin.livejournal.com
Давай я ещё попробую.

Представь, что тебе нужно решить задачу с одноименным отцом на бумаге.
(Вживемся в роль СУБД)
У тебя есть листок с таблицей
номер человека | ФИО | Дата рождения | Номер отца
Проблема в том, что ты можешь смотреть в один момент только на одну строчку таблицы. Зато можно заглядывать в другие таблицы, не забывая строчку из первой

Поэтому ты идешь к ксероксу и делаешь копию этого листа. Теперь у тебя две одинаковые копии одной таблицы. Ты помечаешь их как Т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.

Date: 2012-09-29 11:50 pm (UTC)
From: [identity profile] 3eta.livejournal.com
Супер, теперь все встало на свои места!
Спасибо большое.
А ты еще не спишь или уже не спишь? У вас там 2 ночи!

Date: 2012-09-30 12:35 am (UTC)
From: [identity profile] 3eta.livejournal.com
что-то не то :-/
SELECT * FROM `People` as `table1`, `People` as `table2` WHERE `table1`.`Father_Person_ID` = `table2`.`Person_ID`
AND `table1`.`First_Name` = `table1`.`First_name`;
возвращает мне список всех людей у которых есть отцы, так же как мой предыдущий запрос со вложенным select-ом, непонятно где собака зарыта. перепроверила все названия колонок :-/

Date: 2012-09-29 11:15 pm (UTC)
From: [identity profile] mme-n-b.livejournal.com
Используйте join всегда, когда в задаче есть фраза <такой же, как>. Не заморачивайтесь пока тем, как они работают на самом деле.

Profile

3eta: (Default)
3eta

September 2021

S M T W T F S
   1234
567891011
12131415161718
19 202122232425
2627282930  

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jun. 25th, 2025 04:41 am
Powered by Dreamwidth Studios