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

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

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.12.2016, 06:33   #1
Lokos
Форумчанин
 
Регистрация: 29.09.2009
Сообщений: 587
По умолчанию Запрос из трех таблиц, дубли информации

Добрый день возникла необходимость собрать данные из 3х связанных таблиц но получается не так как хотелось бы
Есть три таблички
1: `tbDoma`
Street
Home
2:`tbOptions_doma`
Name
Value
Dom_id
3: `tbObject_Beside`
Name
distance
Dom_id

Собственно сам запрос ( так же пробовал делать с joint'ами но результат тот же)
Код:
SELECT 
   `tbDoma`.Street,
   `tbDoma`.Home,
   `tbOptions_doma`.Name,
   `tbOptions_doma`.Value,
   `tbObject_Beside`.`Name` 
   `tbObject_Beside`.`distance` 
FROM 
   `tbOptions_doma`, `tbDoma`,`tbObject_Beside` 
WHERE
   `tbDoma`.Street='Амурская' AND `tbDoma`.Home='84' AND 
   `tbOptions_doma`.Dom_id=`tbDoma`.id AND
    `tbObject_Beside`.Dom_id =    `tbOptions_doma`.Dom_id
Результат не вдохновляет
Амурская 84 Тип здания жилое многоквартирное Автомойка 250 м.
Амурская 84 Тип здания жилое многоквартирное Автостоянка 250 м.
Амурская 84 Тип здания жилое многоквартирное Аптека 350 м.
............................пока не выведутся все поля таблицы Beside................
Амурская 84 Ввод в эксплуатацию 1963 г. Автомойка 250 м.
Амурская 84 Ввод в эксплуатацию 1963 г. Автостоянка 250 м.
и т.д.

Как такого можно избежать, что то не получается не чего придумать
или лучше разбить данный запрос на 3? сперва найти ld а по нему остальные значения 2х таблиц?

Последний раз редактировалось Lokos; 21.12.2016 в 07:32.
Lokos вне форума Ответить с цитированием
Старый 21.12.2016, 07:35   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

А что получить то нужно и не написал. На примере лучше
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 21.12.2016, 09:05   #3
Lokos
Форумчанин
 
Регистрация: 29.09.2009
Сообщений: 587
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
А что получить то нужно и не написал. На примере лучше
получить нужно результат без дублирования, тоесть

Амурская 84 Тип здания жилое многоквартирное Автомойка 250 м.
Амурская 84 Ввод в эксплуатацию 1963 г. Аптека 250 м.
Амурская 84 null Заправка 300м
Lokos вне форума Ответить с цитированием
Старый 21.12.2016, 09:13   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

А откуда узнать, что автомойку прицепить к типу здания, аптеку к к вводу в эксплуатацию, а заправку ни к чему? Просто запросом не сделать, хранимка с кусорами, REPEAT, FETCH и прочее. Или программно из парочки запросов
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 21.12.2016 в 09:31.
Аватар вне форума Ответить с цитированием
Старый 21.12.2016, 09:35   #5
Lokos
Форумчанин
 
Регистрация: 29.09.2009
Сообщений: 587
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
А откуда узнать, что автомойку прицепить к типу здания, аптеку к к вводу в эксплуатацию, а заправку ни к чему? Просто запросом не сделать, хранимка с кусорами, REPEAT, FETCH и прочее. Или программно из парочки запросов
не так объяснил наверное, знать не чего и не нужно, даже и не знаю как объяснить, впринцыпе сделал все в пару запросов нормально работает
Lokos вне форума Ответить с цитированием
Старый 21.12.2016, 09:41   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Покажи как в пару запросов.
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 21.12.2016, 09:51   #7
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Код:
select ... --тип здания
UNION 
select ... --ввод в экспл.
UNION
select ... -- близлежащие объекты
ЕСЛИ ...
"повезет" и будут одинаковые типы и количество данных.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 21.12.2016, 12:20   #8
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Код:
select left.*, right.*
from ( select 1 as nn, ...
  union select 2 as nn, ....
     ) as left_t
RIGHT JOIN ( select ??? as nn, .....
    ) as right_t on right_t.nn =left_t.nn
ЕСЛИ ...
1. найдется чем заменить ??? в последнем вложенном запросе (recno ? )
или же найдется возможность написать функцию (вычислимое поле) для этого.
обычно это
Код:
select ... , ( select count() from where ? < ? ) as nn  from ... order by ?
2. первые два запроса "отдадут" ровно по одной записи.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 21.12.2016, 12:33   #9
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Тоже подумал сгенерить что-то типа порядкового номера и к нему цепляться. Но это же не эффективно. Не лучше курсора и программного способа. И вообще такой способ выдачи данных мне не понятен, что-то ТС не то делает. Отобрази на форме основную табличку с домами, информация описательного характера как у него в отдельных дочерних отображается для текущей строки основной таблицы. И связь Master-Detail или в AfterScroll
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 21.12.2016, 13:02   #10
Heneken87
Форумчанин
 
Регистрация: 27.04.2012
Сообщений: 219
По умолчанию

Код:
select t.Street,t.Home,t.Name,t.Value ,t.distance from
(
SELECT 
   `tbDoma`.Street as Street ,
   `tbDoma`.Home as Home ,
   `tbOptions_doma`.Value as Value ,
   `tbObject_Beside`.`Name` as Name, 
   `tbObject_Beside`.`distance`as distance
FROM 
   `tbOptions_doma`, `tbDoma`,`tbObject_Beside` 
WHERE
   `tbDoma`.Street='Амурская' AND `tbDoma`.Home='84' AND 
   `tbOptions_doma`.Dom_id=`tbDoma`.id AND
    `tbObject_Beside`.Dom_id =    `tbOptions_doma`.Dom_id
) as t 
group by  t.Street,t.Home,t.Name,t.Value ,t.distance
 order by  t.Street,t.Home,t.Name,t.Value ,t.distance
Качество кода не гарантирую. Работаю с MsSQL,Firebird подобное там выполнить можно
Пишу много и развернуто

Последний раз редактировалось Heneken87; 21.12.2016 в 13:19.
Heneken87 вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Объединение двух таблиц исключая дубли AVGRIN Microsoft Office Excel 3 13.01.2013 21:52
Связь трех таблиц Paradox для дальнейшего расчета tglhteam SQL, базы данных 0 22.07.2011 14:24
Вывести записи из трех таблиц Demares SQL, базы данных 6 02.03.2011 13:30
select-запрос из трех таблиц AJlEKCA БД в Delphi 10 19.01.2011 01:38
как свзять в Дельфи более трех таблиц воедино ahvahsky2008 Помощь студентам 1 10.03.2010 11:36