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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.11.2015, 12:11   #1
nactyx
Форумчанин
 
Регистрация: 11.10.2010
Сообщений: 152
По умолчанию Сложный SQL запрос

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

Имеется вот такой работающий запрос:
Код:
select (select top 1 stValue from stLinks
inner join stLinkAttributes 
on inIdLink = 4668915 and inIdLinkAttr = 534 
where inIdParent = idTP and inIdChild = idOp) oper_num, 
(select model from dbo.uit_fnGetAttrStanok(idOp)) mod_st,
stValue oper_name_long, 
(reTimeOnDse + cast(reSetUp as float))/3600 oper_time, 
reTimeOnDse /3600 TimeOSN, 
cast(reSetUp as float) / 3600 TimePZ, 
(reTshtFactor + reTpzFactor)/3600 foper_time, 
reTshtFactor / 3600 fTimeOSN, 
reTpzFactor / 3600 fTimePZ, 
(reTshtNorm + reTpzNorm)/3600 noper_time, 
reTshtNorm/3600 nTimeOSN, 
reTpzNorm /3600 nTimePZ, 
'''' oper_name_short 
from uit_vwTechOper 
where idTP = 3707847
Необходимо его немного модифицировать добавив дополнительное условие для idTP, которое будет исключать неактивные TP.
Это условие нужно "достать" из таблицы uit_ActiveTP там есть поле idTP и поле active. Если это самое active = 1 - то TP нам подходит.

Вот моя версия модифицирования (но она ошибочная, поэтому и нужна помощь):
Код:
select (select top 1 stValue from stLinks
inner join stLinkAttributes 
on inIdLink = 4668915 and inIdLinkAttr = 534 
where inIdParent = a.idTP and inIdChild = idOp) oper_num, 
(select model from dbo.uit_fnGetAttrStanok(idOp)) mod_st,
stValue oper_name_long, 
(reTimeOnDse + cast(reSetUp as float))/3600 oper_time, 
reTimeOnDse /3600 TimeOSN, 
cast(reSetUp as float) / 3600 TimePZ, 
(reTshtFactor + reTpzFactor)/3600 foper_time, 
reTshtFactor / 3600 fTimeOSN, 
reTpzFactor / 3600 fTimePZ, 
(reTshtNorm + reTpzNorm)/3600 noper_time, 
reTshtNorm/3600 nTimeOSN, 
reTpzNorm /3600 nTimePZ, 
'''' oper_name_short 
from uit_vwTechOper a, uit_ActiveTP b
where a.idTP = 3707847 and b.idTP = a.idTP and active = 1
Прим.: красным для наглядности выделил то, что добавил в запрос.
nactyx вне форума Ответить с цитированием
Старый 20.11.2015, 12:26   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Цитата:
но она ошибочная
И в чем ошибка выражается? А ваще расставь перед каждым именем поля псевдоним таблицы с точкой
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 20.11.2015 в 12:29.
Аватар вне форума Ответить с цитированием
Старый 20.11.2015, 12:59   #3
nactyx
Форумчанин
 
Регистрация: 11.10.2010
Сообщений: 152
По умолчанию

Ошибки как таковой нет, он отрабатывает, но явно неверно отрабатывает.

Хотя стоп, похоже, что с моими изменениями запрос отрабатывает как надо, а я туплю просто

Последний раз редактировалось Stilet; 23.11.2015 в 16:24.
nactyx вне форума Ответить с цитированием
Старый 23.11.2015, 13:53   #4
nactyx
Форумчанин
 
Регистрация: 11.10.2010
Сообщений: 152
По умолчанию

Продолжение истории.

Имеется вот такой запрос:

Код:
      SELECT G.product,G.g_absolute_posit,G.g_quant_in_ord,G.g_name,G.mat_product, 
             G.g_nom_code, E.prev, E.elt_shop, E.id_elt, min(stL.inidparent) as [TehPr] 
      FROM #ord_wayb G INNER JOIN 

              (SELECT  C.id_elt, C.id_tree, C.sort_order, P.elt_shop AS prev, C.elt_shop 
                  FROM  #ord_wayb C LEFT OUTER JOIN 
                        #ord_wayb P ON C.id_tree = P.id_tree AND 
                         C.elt_sequence = P.elt_sequence + 1 
                  WHERE (C.type = ''Элемент маршрута'')) 

             E  ON G.id_tree = E.id_tree 
             LEFT JOIN stLinks stL on (E.id_elt=stL.inidchild and (stL.inidtyperel=1221 or (stL.inidtyperel>=1223 and stL.inidtyperel<=1231) )) 
      WHERE     (G.id_good IS NOT NULL) AND 
                (E.elt_shop = ''' + ceh + ''' ) 
   group by 	G.product,     
	 G.g_absolute_posit,     
	 G.g_quant_in_ord,       
	 G.g_name,G.mat_product,   
	 G.g_nom_code,       
	 E.prev,         
	 E.elt_shop,        
  	E.id_elt,E.sort_order    
      ORDER BY E.sort_order
Во второй строке необходимо изменить принцип выборки для min(stL.inidparent) as [TehPr]. Т.е. сделать не просто min, а определенное условие выбора из нескольких inidparent.
Условие заключается в том, что выбрать нужно такое inidparent, которое в таблице [dbo].[uit_ActiveTP] a удовлетворяет двум условиям: a.idTP = inidparent and active = 1. Надеюсь смог объяснить доступно. Т.е. вопрос в том, в какое место правильно "засунуть" это условие.

Пробовал вместо красного вот такие варианты:

Код:
(SELECT top 1 as [TehPr] FROM stLinks stL, uit_ActiveTP b where b.idTP = stL.inidparent and active = 1)
Код:
(SELECT stL.inidChild as [TehPr] FROM stLinks stL, uit_ActiveTP b where b.idTP = stL.inidparent and active = 1)
Код:
(SELECT stL.inidChild as [TehPr] FROM stLinks stL, uit_ActiveTP b where b.idTP = stL.inidparent and active = 1)
Но всё не то...

Последний раз редактировалось Stilet; 23.11.2015 в 16:26.
nactyx вне форума Ответить с цитированием
Старый 23.11.2015, 16:30   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Пока мне ничего не ясно... Одно могу сказать точно: Я бы так не делал.
Я б этот запрос развернул на несколько вьюшек или ХПшек, и их использовал в главном запросе.
Т.е. min(stL.inidparent) as [TehPr] оттуда выкинуть, оформить в вьюшку.
А потом чего-то типа такого:
Код:
select вьюшка.* 
from вьюшка,stLinks stL, uit_ActiveTP b 
where b.idTP = stL.inidparent and active = 1)
Или через LEFT JOIN. Конкретно сказать не могу, ибо БД твою в глаза не видел.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 23.11.2015, 16:36   #6
nactyx
Форумчанин
 
Регистрация: 11.10.2010
Сообщений: 152
По умолчанию

А если подобным образом сделано было до меня и надо изменить аналогичным, это возможно вообще?

По поводу БД, вот структура используемых таблиц:
Код:
CREATE TABLE [dbo].[stLinks](
	[inId] [int] IDENTITY(1,1) NOT NULL,
	[inIdParent] [int] NOT NULL,
	[inIdChild] [int] NOT NULL,
	[inIdTypeRel] [int] NOT NULL,
	[inMaxQuantity] [float] NULL,
	[inMinQuantity] [float] NULL,
	[inIdMeasure] [int] NULL,
	[inIdUnit] [int] NULL,
	[State] [int] NULL,
	[dtModified] [datetime] NOT NULL,
	[inIdOrgOwner] [int] NULL,
	[dtSynchDate] [datetime] NULL,
	[stGUID] [varchar](255) NOT NULL,
 CONSTRAINT [PK_stLinks] PRIMARY KEY CLUSTERED 
(
	[inId] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON, FILLFACTOR = 100) ON [PRIMARY]
) ON [PRIMARY]

Код:
CREATE TABLE [dbo].[uit_ActiveTP](
	[idTP] [int] NULL,
	[idER] [int] NULL,
	[active] [bit] NULL
) ON [PRIMARY]
Код:
Add('if OBJECT_ID(''tempdb..#ord_wayb'') is null CREATE TABLE   #ord_wayb(sort_order int IDENTITY, type varchar(255), ');
Add(' state varchar(255), product varchar(255), version varchar(255), ');
Add(' id_tree  varchar(255), id_good int, g_absolute_posit varchar(255), ');
Add(' g_name varchar(255), g_mass float, g_black_mass float, g_quantity float, ');
Add(' g_quant_in_ord float, g_sertificat varchar(255), g_passport varchar(255), ');
Add(' g_date_to_shop varchar(255), g_nom_code varchar(20), blank_mass varchar(255), ');
Add(' blank_coeff varchar(255),mat_product varchar(255), mat_mark varchar(255), ');
Add(' mat_ntd varchar(255), mat_rng varchar(255), mat_rng_size varchar(255), ');
Add(' id_elt int,  elt_shop varchar(255), elt_sequence int, elt_doing varchar(255), ');
Add(' elt_note nvarchar(255), id_delway int, dw_data varchar(255), ');
Add(' dw_q_blanks varchar(255), dw_q_good_blanks varchar(255), addins bit) ');
Если надо еще что-нибудь - пишите. Я потому что голову сломал и никак не получается.

Сделал вот так:
Код:
min(case when a.idTP = stL.inidparent and active = 1 then stL.inidparent end) as [TehPr]
Вроде то, что нужно. Тестирую еще.

Последний раз редактировалось Stilet; 23.11.2015 в 17:27.
nactyx вне форума Ответить с цитированием
Старый 23.11.2015, 17:28   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Я не большой специалист в SQL и мне сложно анализировать чужое. Сам я таких монстров стараюсь избегать изменениями в структуре БД. Ну или заранее структуру продумывать.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сложный запрос SQL irina1410 БД в Delphi 4 03.07.2012 16:46
Сложный запрос на выборку SQL simka16 Помощь студентам 0 21.02.2011 18:43
Сложный запрос в SQL A-Lex-Is SQL, базы данных 1 10.08.2010 23:19
сложный sql запрос kate158 БД в Delphi 0 18.09.2008 11:38
Сложный SQL-запрос ole777 БД в Delphi 1 08.05.2007 20:56