Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.04.2012, 17:33   #1
TRoman
Новичок
Джуниор
 
Регистрация: 27.04.2012
Сообщений: 5
По умолчанию как правильно объеденить таблицы?

подскажите может кто сталкивался
есть две таблицы

таблица1

ПОЛЕ1:Текстовое значение
ПОЛЕ2:Численное значение

Таблица2
ПОЛЕ1:Текстовое значение
ПОЛЕ2:Численное значение

Примерно выглядит так
ТАБЛИЦА 1 ТАБЛИЦА 2
ПОЛЕ1 ПОЛЕ2 ПОЛЕ1 ПОЛЕ2
запись1 4 запись5 4
запись2 4 запись6 7
запись3 5 запись8 19

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

РЕЗУЛЬТАТ ЗАПРОСА
ПОЛЕ1.ТАБЛИЦА1 | ПОЛЕ1.ТАБЛИЦА2
запись1 | запись5
запись2 |

т.е. вывести в результирующую таблицу записи поля записей таблиц, ПОЛЕ2 для которых имеет одинаковое значение (в примере=4)
пробовал left join и т.д. не получается
TRoman вне форума Ответить с цитированием
Старый 27.04.2012, 17:44   #2
=master=
Форумчанин
 
Регистрация: 26.03.2012
Сообщений: 665
По умолчанию

А почему запись2 без запись5 ?
=master= вне форума Ответить с цитированием
Старый 28.04.2012, 08:39   #3
TRoman
Новичок
Джуниор
 
Регистрация: 27.04.2012
Сообщений: 5
По умолчанию

Ну в том и вопрос чтоб приставить рядом колонки из таблиц разных. запись2 никак не должна быть с записью5. в ТАБЛИЦЕ2, Поле2 имеет одну запись со значением 4 значит стольно записей и в результирующей таблице остальные имеют пустое значение.
TRoman вне форума Ответить с цитированием
Старый 28.04.2012, 08:52   #4
=master=
Форумчанин
 
Регистрация: 26.03.2012
Сообщений: 665
По умолчанию

Ну хорошо, а почему запись5 с запись1 а не с запись2? они обе с 4, а значит равнозначны, нужен доп. критерий указывающий что именно запись1 с запись5 а не запись2.


И субд надо бы указать.
=master= вне форума Ответить с цитированием
Старый 28.04.2012, 09:05   #5
TRoman
Новичок
Джуниор
 
Регистрация: 27.04.2012
Сообщений: 5
По умолчанию

критерий - первая на очереди в списке. они вообще никак не связаны это колонки с разных таблиц... ну я как бы переформулирую... это вот так представьте себе - отфильтровали ТАБЛИЦУ1 по полю2=4, отфильтровали ТАБЛИЦУ2 по полю2=4 и просто приставили колонки друг к другу... Допустим в делфи я бы взял StringGrid1 и в 1ю колонку вывел бы результат SELECT ... FROM ТАБЛИЦА1... where ПОЛЕ2=4, во вторую колонку STRINGGrida вывел бы SELECT ... FROM ТАБЛИЦА2... where ПОЛЕ2=4, если б строк не хватало добавил бы просто - в какой табличке больше б записей было б такой высоты б и был бы StringGrid. Я вот просто подумал ну по логике должна ж быть в SQL какаято конструкция позволяющая єто сделать в SQL именно... или никак?

Последний раз редактировалось TRoman; 28.04.2012 в 11:41.
TRoman вне форума Ответить с цитированием
Старый 28.04.2012, 09:24   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Я вот просто подумал ну по логике должна ж быть в SQL какаято конструкция позволяющая єто сделать в SQL именно...
с чего это вдруг в языке запросов должна быть подобная конструкция?!!
идея у вас изначально порочная (точнее, не имеющая никакого отношения к реляционным БД, которые, собственно, и обрабатывает SQL).
Поэтому, хорошее решение (универсальное) Вы вряд ли найдёте, а вот извращённое можно попытаться сочинить...
например, добавить в запросы получение RecNo (rownumber, rownum и т.п.) и объединять таблицы по этому номеру.
только учтите, что при этом нужно знать, в какой таблице будет заведомо больше записей (какую таблицу ставить слева в LEFT JOIN), иначе все "лишние" строчки в запрос не попадут.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 28.04.2012, 09:44   #7
TRoman
Новичок
Джуниор
 
Регистрация: 27.04.2012
Сообщений: 5
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
идея у вас изначально порочная (точнее, не имеющая никакого отношения к реляционным БД, которые, собственно, и обрабатывает SQL).
так уж ли?

добавте ,ТАБЛИЦУ 3 которая будет иметь поле ID (уникальное) на которое и ссылаются ПОЛЯ2 в ТАБЛИЦЕ1 и 2. и вот вам реляционность ТАБЛИЦА1 реляционна по отношению к ТАБЛИЦЕ3, ТАБЛИЦА2 реляционна к ТАБЛИЦЕ3. только ТАБЛИЦА2 никак не реляционна к ТАБЛИЦЕ1 именно ввиду такого взаимоотношения таблиц я и пытаюсь решить задачу методами SQL и потому и предположил что должно содержать конструкцию выполняющую такой запрос, когда две или более таблиц реляционны к третьей но нереляционны между собой
TRoman вне форума Ответить с цитированием
Старый 28.04.2012, 11:26   #8
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
когда две или более таблиц реляционны к третьей но нереляционны между собой
Цитата:
которая будет иметь поле ID (уникальное) на которое и ссылаются ПОЛЯ2 в ТАБЛИЦЕ1 и 2. и вот вам реляционность
Укажите нам такие поля в вашем ПЕРВОНАЧАЛЬНОМ примере! (таблицу 3 можете не указывать).
или же в ЭТОМ!
Цитата:
Допустим в делфи я бы взял StringGrid1 и в 1ю колонку вывел бы результат SELECT ... FROM ТАБЛИЦА1... where ПОЛЕ2=4, во вторую колонку STRINGGrida вывел бы SELECT ... FROM ТАБЛИЦА1... where ПОЛЕ2=4, если б строк не хватало добавил бы просто - в какой табличке больше б записей было б такой высоты б и был бы StringGrid.
связь либо есть (прямая / косвенная через другую таблицу / подразумеваемая без ключей просто по значению)
либо ее нет.

P.S. а для вашего модифицированного варианта. даже без использования table3.
выведет сначала все общие , потом оставшиеся t1, еще потом оставшиеся t2
Код:
select 0, t1.* t2.* from t1 
inner join t2 on t1.f1 =t2.f2  // вот она ваша отсутствующая связь

union 
select 1, t1.*, t2.* from t1 
left join t1 on t1.f1 =t2.f2
where t1.f1 not in ( select t2.f2 from t2 ) 

union 
select 2, t1.*, t2.* from t2 
left join t1 on t1.f1 =t2.f2
where t2.f2 not in ( select t1.f1 from t1 ) 

order by 1
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 28.04.2012 в 11:56.
evg_m вне форума Ответить с цитированием
Старый 28.04.2012, 11:40   #9
TRoman
Новичок
Джуниор
 
Регистрация: 27.04.2012
Сообщений: 5
По умолчанию

честно вообще не понял что вы пытались сейчас уточнить

в первоначальном примере запись1 и запись2 из таблицы1 имела занчение поле2=4 как и запись5 из таблицы2 имела поле2=4

ну может первоначальный пример имел недосказанность некоторую
давайте считать что поле2 в обеих таблицах реф. ссылка на ID из таблицы3.
хотя результат ожидаемый от запроса в первоначальном примере в общем полагал наличие параметра определяющего значение поля2=4

тем и объясняется пример со стринггридом)))

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

короче если кто знает как это решить конструкцией SELECT FROM то буду признателен
TRoman вне форума Ответить с цитированием
Старый 28.04.2012, 11:46   #10
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

В MS SQL, например, такую выборку можно сделать, но в хранимой процедуре или кучей команд, с использованием курсоров и временных таблиц. Одним селектом никак
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как правильно спроектировать таблицы будущей БД Newbabe БД в Delphi 2 22.04.2011 12:32
DB Access - как правильно создать бд и связать таблицы? XerSon БД в Delphi 5 19.04.2011 11:41
Фреймы как объеденить в один??? p1nk HTML и CSS 3 05.03.2010 16:19
Selection - как объеденить??? Sensygirl Microsoft Office Excel 8 05.10.2009 18:03
Как правильно получить координаты по клику на ячейку таблицы? Stilet JavaScript, Ajax 3 26.08.2009 16:19