LINUX.ORG.RU

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

 


0

1

Возможно тут совсем все просто, но мои познания SQL увы невысоки, итак дано

[Таблица People]

RecID   Name
____________
1       Peter
2       Sam
3       Peter
4       Jim

[Таблица Phone]

Phone  Name
___________
11111  Peter
33333  Jim
44444  Peter

нужно получить на выходе:

RecID   Name Phone
__________________
1       Peter 11111
1       Peter 44444
3       Peter 11111
3       Peter 44444
4       Jim   33333

т.е. нужно вместо каждой записи в «People» вставить набор записей из «Phone» где совпадает Name, при этом оставив оригинальный RecID записи


Ответ на: комментарий от MikeDM

> Очень рекомендую почитать книги по базам данных и по SQL.

спасибо, обязательно прочитаю - просто с SQL сталкиваться не приходилось, и если уж на то пошло - может покажете правильное решение? :)

aho
() автор топика
Ответ на: комментарий от aydar

> SELECT People.RecID as RecID, Phone.Name as Name, Phone.Phone as Phone

FROM People, Phone

WHERE People.Name = Phone.Name



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

aho
() автор топика
Ответ на: комментарий от aho

Не получилось, потому, что я невнимательно на описание таблиц поглядел.
надо заменить на on pe.Name=ph.Name

а вообще, лучше бы вы в таблице с телефонами заменили имена на IDы людей.

ovax ★★★
()
Ответ на: комментарий от aydar

> добавь вконце

нужно обязательно сохранять порядок - «вместо каждой записи в „People“ вставить набор записей из „Phone“, причем именно в оригинальном порядке, order by как я понимаю этого не гарантирует - только сортирует ID

aho
() автор топика
Ответ на: комментарий от ovax

> а вообще, лучше бы вы в таблице с телефонами заменили имена на IDы людей.

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

aho
() автор топика
Ответ на: комментарий от arsi

> select RecID,Name,Phone from People cross join Phone using (Name);

а вот это именно оно, спасибо большое вам - задача решена

aho
() автор топика
Ответ на: комментарий от aydar

> В оригинальном порядке как раз отсортировано по RecID

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

aho
() автор топика
Ответ на: комментарий от aho

правильное решение это правильно сделать базу, а точнее отношения между таблицами.

у тебя в корне неверно созданы таблицы. пересмотри подход к хранению данных.

MikeDM ★★★★★
()
Ответ на: комментарий от MikeDM

> правильное решение это правильно сделать базу, а точнее отношения между таблицами.

у тебя в корне неверно созданы таблицы. пересмотри подход к хранению данных


кажется на ЛОР есть не только умные люди, но еще и умничающие :) еще раз - БД создаю не я, более того, мне нужен универсальный алгоритм для произвольной БД - т.е. на вход любых два курсора( не обязательно таблицы ), плюс поля по которым надо связать, а мне надо получить результат в том виде, который я указал в верхнем сообщении

aho
() автор топика
Ответ на: комментарий от aho

>select RecID,Name,Phone from People cross join Phone using (Name)
Это только в MySql будет работать http://dev.mysql.com/doc/refman/5.0/en/join.html

In MySQL, CROSS JOIN is a syntactic equivalent to INNER JOIN (they can replace each other). In standard SQL, they are not equivalent. INNER JOIN is used with an ON clause, CROSS JOIN is used otherwise.

так пробуй:

1)select people.RecID, phone.Name, phone.Phone from People cross join Phone where people.name = phone.name 

2)select RecID, Name, Phone from People join Phone using(name)

aydar ★★★★★
()
Ответ на: комментарий от aydar

> Это только в MySql будет работать

я на SQLITE проверял - в нем тоже сработало, сейчас сяду читать про JOIN в SQL

select people.RecID, phone.Name, phone.Phone from People cross join Phone where people.name = phone.name


да, так видимо лучше всего, спасибо

aho
() автор топика
Ответ на: комментарий от aho

>я на SQLITE проверял - в нем тоже сработало, сейчас сяду читать про JOIN в SQL

тут не только про джойны почитать нужно, а целиком книжечку.

Deleted
()
Ответ на: комментарий от Deleted

> тут не только про джойны почитать нужно, а целиком книжечку.

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

aho
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.