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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.08.2015, 16:48   #1
nactyx
Форумчанин
 
Регистрация: 11.10.2010
Сообщений: 152
Восклицание Необходима помощь в составлении запроса (подробнее в теме, в двух словах не объяснить)

Всем доброго времени суток! Нужна Ваша помощь.

Суть проблемы в следующем:
Имеется выборка некоторых ID (результат моего запроса), так называемых inIdChild ("дети"). У каждого из них есть inIdParent ("родитель"). Их связи отображаются в некоторой таблице dbo.Links (два столбца: inIdParent и inIdChild). Но у этих самых "родителей" inIdParent обязательно имеется второй "ребенок", еще один inIdChild.
Выглядит это примерно так:
inIdParent inIdChild
1 a
1 b
2 c
2 d
и т.д.

Вопрос: как найти связь между обоими inIdChild? Т.е. мне нужен запрос, результатом которого будет что-то вроде этого (на основе примерной таблицы выше):
1й child 2й child
a b
c d
и т.д.

В sql не силен особо и на этом голову сломал, но так ни к чему и не пришел. Очень рассчитываю на Вашу помощь. Заранее благодарю.

P.S. Если что непонятно объяснил - спрашивайте, уточню.
nactyx вне форума Ответить с цитированием
Старый 20.08.2015, 17:06   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

что-то вроде этого
Код:
select --что хотим увидеть
first_child.idchild as idfirstchild,  --по первому ребенку
second_child.idchild as idsecondchild --по второму ребенку
from --откуда брать данные
child as first_child,  --по первому ребенку
child as second_child --по второму ребенку
where --какие данные надо получить 
first_child.idparent =second_child.idparent --родитель первого и второго ребенка совпали
А если у "родителей" не РОВНО два ребенка?!
если меньше(окажется один) то в таком разе мы его просто не увидим (в приведенном примере)
А если больше (например три) что мы захотим увидеть?

c учетом links будет так
Код:
select 
.... 
from 
child as first_child,
child as second_child,
links as first_link,
links as second_link
where 
  first.child.id =first_link.idchild --соотв. связь по первому ребенку
and first_link.idparent =second_link.idparent  --совпадение родителя
and second_link.idchild =second_child.id --соот. связь по второму ребенку
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 20.08.2015 в 17:16.
evg_m вне форума Ответить с цитированием
Старый 21.08.2015, 09:47   #3
nactyx
Форумчанин
 
Регистрация: 11.10.2010
Сообщений: 152
По умолчанию

evg_m, спасибо! Вроде помогло.

Но теперь новая проблема. Написал запрос для получения двух столбцов по столбцу из разных таблиц (из двух), которые связаны по ID. Но получаю в итоге количество записей умноженных друг на друга, относительно того, если эти два запроса вызвать по одному.

Код:
select p._PRODUCT
       ,v.value
FROM [Тяжмаш].[dbo].[vwObjects] p, [Тяжмаш].[dbo].[rvwAttributes] v
where p._ID in
(SELECT inIdChild
  FROM [Тяжмаш].[dbo].[stLinks]
  where inIdTypeRel in
  (SELECT inId
  FROM [Тяжмаш].[dbo].[vwTypesAndTypes]
  where stParentType = 'Маршрут' and stChildType <> 'Элемент маршрута')
  and inIdParent in
  (SELECT [_ID]
  FROM [Тяжмаш].[dbo].[vwObjects]
  where _TYPE = 'Маршрут' and _ID in
  (SELECT [inIdParent]
  FROM [Тяжмаш].[dbo].[stLinks]
  where inIdChild in
  (SELECT a.idElm
  FROM [Тяжмаш].[dbo].[uit_vwTechProc] a
 where a.idElm is not NULL and not exists 
(SELECT 1
  FROM [Тяжмаш].[dbo].[uit_vwTechProc] c, [Тяжмаш].[dbo].[uit_ActiveTP] b
 where b.idTP = c.idTP and active = 1 and a.idElm = c.idElm)))))
and v.idattr = '2' and v.idversion in
(SELECT inIdChild
  FROM [Тяжмаш].[dbo].[stLinks]
  where inIdTypeRel in
  (SELECT inId
  FROM [Тяжмаш].[dbo].[vwTypesAndTypes]
  where stParentType = 'Маршрут' and stChildType <> 'Элемент маршрута')
  and inIdParent in
  (SELECT [_ID]
  FROM [Тяжмаш].[dbo].[vwObjects]
  where _TYPE = 'Маршрут' and _ID in
  (SELECT [inIdParent]
  FROM [Тяжмаш].[dbo].[stLinks]
  where inIdChild in
  (SELECT a.idElm
  FROM [Тяжмаш].[dbo].[uit_vwTechProc] a
 where a.idElm is not NULL and not exists 
(SELECT 1
  FROM [Тяжмаш].[dbo].[uit_vwTechProc] c, [Тяжмаш].[dbo].[uit_ActiveTP] b
 where b.idTP = c.idTP and active = 1 and a.idElm = c.idElm)))))
nactyx вне форума Ответить с цитированием
Старый 21.08.2015, 10:08   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
Но получаю в итоге количество записей умноженных друг на друга, относительно того, если эти два запроса вызвать по одному.
так надо же указать КАКИЕ записи СООТВЕТВУЮТ друг другу. аналогично как здесь.
Цитата:
Код:
where --какие данные надо получить 
first_child.idparent =second_child.idparent --родитель первого и второго ребенка
Код:
where --какие данные надо получить 
.....
and p.???? =v.???? --КАКИЕ ПАРЫ ОТБИРАТЬ
P.S. почитайте Мартин Грубер. Понимание SQL.

запросы можно использовать не только в конструкциях p.id in (....),
но и качестве таблиц from ( select ... ) p
Код:
select p._PRODUCT,  v.value

FROM ( SELECT inIdChild,  _product
            FROM [Тяжмаш].[dbo].[stLinks]
       where inIdTypeRel in ( SELECT inId FROM [Тяжмаш].[dbo].[vwTypesAndTypes]
                              where stParentType = 'Маршрут' and stChildType <> 'Элемент маршрута')
         and inIdParent in ( SELECT [_ID] FROM [Тяжмаш].[dbo].[vwObjects]
                             where _TYPE = 'Маршрут' and _ID in ( SELECT [inIdParent] FROM [Тяжмаш].[dbo].[stLinks]
                                                                  where inIdChild in ( SELECT a.idElm FROM [Тяжмаш].[dbo].[uit_vwTechProc] a
                                                                                       where a.idElm is not NULL 
                                                                                         and not exists ( SELECT 1 FROM [Тяжмаш].[dbo].[uit_vwTechProc] c
                                                                                                                      , [Тяжмаш].[dbo].[uit_ActiveTP] b
                                                                                                          where b.idTP = c.idTP and active = 1 
                                                                                                            and a.idElm = c.idElm ) ) ) )
     ) p,

   ( SELECT inIdChild,  value
      FROM [Тяжмаш].[dbo].[stLinks]
     where inIdTypeRel in ( SELECT inId FROM [Тяжмаш].[dbo].[vwTypesAndTypes]
                            where stParentType = 'Маршрут' and stChildType <> 'Элемент маршрута' )
      and inIdParent in ( SELECT [_ID] FROM [Тяжмаш].[dbo].[vwObjects]
                          where _TYPE = 'Маршрут' and _ID in ( SELECT [inIdParent] FROM [Тяжмаш].[dbo].[stLinks]
                                                               where inIdChild in ( SELECT a.idElm FROM [Тяжмаш].[dbo].[uit_vwTechProc] a
                                                                                    where a.idElm is not NULL 
                                                                                      and not exists ( SELECT 1 FROM [Тяжмаш].[dbo].[uit_vwTechProc] c
                                                                                                              , [Тяжмаш].[dbo].[uit_ActiveTP] b
                                                                                                       where b.idTP = c.idTP and active = 1 
                                                                                                         and a.idElm = c.idElm ) ) ) )
 ) v

where v.idattr = '2' 
  and p.inidchil =v.inidchild
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 21.08.2015 в 11:29.
evg_m вне форума Ответить с цитированием
Старый 21.08.2015, 10:41   #5
nactyx
Форумчанин
 
Регистрация: 11.10.2010
Сообщений: 152
По умолчанию

Спасибо, всё получилось! Просто в конце через and дописал p._ID = v.idversion.
Книжку взял на примету, спасибо.

Единственная проблема по итогу, уж очень долго отрабатывает запрос (что и понятно, судя по конструкции), может есть возможно есть оптимизировать?
nactyx вне форума Ответить с цитированием
Старый 21.08.2015, 10:48   #6
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
может есть возможно есть оптимизировать?
Цитата:
запросы можно использовать не только в конструкциях p.id in (....),
но и качестве таблиц from ( select ... ) p
смотри пример в предыдущем посте. Но там только первое приближение, просто как пример, по хорошему надо совсем уйти от in (select
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 21.08.2015, 10:55   #7
nactyx
Форумчанин
 
Регистрация: 11.10.2010
Сообщений: 152
По умолчанию

Не заметил редакции сообщения. Хорошо.

Тогда последний вопрос: ко всей этой конструкции хочу прикрепить еще один столбец:
Код:
SELECT p._PRODUCT
       ,v.value
       ,e.stValue
FROM [Тяжмаш].[dbo].[vwObjects] p, [Тяжмаш].[dbo].[rvwAttributes] v, [Тяжмаш].[dbo].[vwAttrValues] e
where p._ID in
(SELECT inIdChild
  FROM [Тяжмаш].[dbo].[stLinks]
  where inIdTypeRel in
  (SELECT inId
  FROM [Тяжмаш].[dbo].[vwTypesAndTypes]
  where stParentType = 'Маршрут' and stChildType <> 'Элемент маршрута')
  and inIdParent in
  (SELECT [_ID]
  FROM [Тяжмаш].[dbo].[vwObjects]
  where _TYPE = 'Маршрут' and _ID in
  (SELECT [inIdParent]
  FROM [Тяжмаш].[dbo].[stLinks]
  where inIdChild in
  (SELECT a.idElm
  FROM [Тяжмаш].[dbo].[uit_vwTechProc] a
 where a.idElm is not NULL and not exists 
(SELECT 1
  FROM [Тяжмаш].[dbo].[uit_vwTechProc] c, [Тяжмаш].[dbo].[uit_ActiveTP] b
 where b.idTP = c.idTP and active = 1 and a.idElm = c.idElm)))))
and v.idattr = '2' and v.idversion in
(SELECT inIdChild
  FROM [Тяжмаш].[dbo].[stLinks]
  where inIdTypeRel in
  (SELECT inId
  FROM [Тяжмаш].[dbo].[vwTypesAndTypes]
  where stParentType = 'Маршрут' and stChildType <> 'Элемент маршрута')
  and inIdParent in
  (SELECT [_ID]
  FROM [Тяжмаш].[dbo].[vwObjects]
  where _TYPE = 'Маршрут' and _ID in
  (SELECT [inIdParent]
  FROM [Тяжмаш].[dbo].[stLinks]
  where inIdChild in
  (SELECT a.idElm
  FROM [Тяжмаш].[dbo].[uit_vwTechProc] a
 where a.idElm is not NULL and not exists 
(SELECT 1
  FROM [Тяжмаш].[dbo].[uit_vwTechProc] c, [Тяжмаш].[dbo].[uit_ActiveTP] b
 where b.idTP = c.idTP and active = 1 and a.idElm = c.idElm)))))
and e.inIdAttribute = 162 and e.inIdVersion in  
(SELECT a.idElm
  FROM [Тяжмаш].[dbo].[uit_vwTechProc] a
 where a.idElm is not NULL and not exists 
(SELECT 1
  FROM [Тяжмаш].[dbo].[uit_vwTechProc] c, [Тяжмаш].[dbo].[uit_ActiveTP] b
 where b.idTP = c.idTP and active = 1 and a.idElm = c.idElm))
 and p._ID = v.idversion and p._ID = e.inIdVersion and v.idversion = e.inIdVersion
Перестал выводить вообще что-либо. У меня сомнения насчет последних трех равенств, но не знаю, как в sql можно сделать равенство вида a = b = c

Последний раз редактировалось nactyx; 21.08.2015 в 10:59.
nactyx вне форума Ответить с цитированием
Старый 21.08.2015, 12:54   #8
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

a=b and b=c
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 21.08.2015, 13:18   #9
nactyx
Форумчанин
 
Регистрация: 11.10.2010
Сообщений: 152
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
a=b and b=c
Пробовал и так, все равно 0 записей в итоге.
nactyx вне форума Ответить с цитированием
Старый 24.08.2015, 08:52   #10
nactyx
Форумчанин
 
Регистрация: 11.10.2010
Сообщений: 152
По умолчанию

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


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помощь в составлении программы lafri Помощь студентам 0 02.06.2014 21:59
Расскажите немного о Visual C++ (в двух словах) Ksardas13 Visual C++ 4 04.04.2011 06:19
Компонент - кнопка(подробнее в теме) MeTeOpA Компоненты Delphi 4 05.09.2010 00:08
в двух словах, зацените, подскажите и т.д. ... DelphiForever Софт 0 02.11.2007 11:16