Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Сложный SQL запрос  [new]
gamadjo
Member

Откуда:
Сообщений: 24
Всем доброго времени суток! Нужна Ваша помощь!

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

      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. Надеюсь смог объяснить доступно. Т.е. вопрос в том, в какое место правильно "засунуть" это условие.
23 ноя 15, 15:14    [18460028]     Ответить | Цитировать Сообщить модератору
 Re: Сложный SQL запрос  [new]
Gena928
Member

Откуда: Москва
Сообщений: 1131
gamadjo,

попробуйте вложенный запрос.

В какое место засунуть условие - решать вам :-))))))))))))))))
23 ноя 15, 15:21    [18460078]     Ответить | Цитировать Сообщить модератору
 Re: Сложный SQL запрос  [new]
fury_fury
Member

Откуда:
Сообщений: 96
gamadjo, может вложенный запрос TOP 1?
23 ноя 15, 15:22    [18460089]     Ответить | Цитировать Сообщить модератору
 Re: Сложный SQL запрос  [new]
gamadjo
Member

Откуда:
Сообщений: 24
Так в этом и загвоздка: в какое именно место в этом большом вопросе нужно вложить этот с доп. условием для выборки.
23 ноя 15, 15:23    [18460100]     Ответить | Цитировать Сообщить модератору
 Re: Сложный SQL запрос  [new]
Имеется вот такой жесть
Guest
gamadjo,

отформатируй по-человечески, сложность сразу на порядок и уменьшится.
23 ноя 15, 15:24    [18460112]     Ответить | Цитировать Сообщить модератору
 Re: Сложный SQL запрос  [new]
gamadjo
Member

Откуда:
Сообщений: 24
Имеется вот такой жесть
gamadjo,

отформатируй по-человечески, сложность сразу на порядок и уменьшится.

А что с форматированием-то не так?
23 ноя 15, 15:25    [18460120]     Ответить | Цитировать Сообщить модератору
 Re: Сложный SQL запрос  [new]
Glory
Member

Откуда:
Сообщений: 104760
gamadjo
Надеюсь смог объяснить доступно.

Самый доступный метод описан здесь в п.4 и п.6
23 ноя 15, 15:28    [18460135]     Ответить | Цитировать Сообщить модератору
 Re: Сложный SQL запрос  [new]
gamadjo
Member

Откуда:
Сообщений: 24
select @@version

Microsoft SQL Server 2008 R2 (SP3) - 10.50.6000.34 (X64) Aug 19 2014 12:21:34 Copyright (c) Microsoft Corporation Standard Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) (Hypervisor)

В остальном, как мне кажется, нет нужды. И там огромные объемы данных.
23 ноя 15, 15:32    [18460168]     Ответить | Цитировать Сообщить модератору
 Re: Сложный SQL запрос  [new]
fury_fury
Member

Откуда:
Сообщений: 96
gamadjo
Так в этом и загвоздка: в какое именно место в этом большом вопросе нужно вложить этот с доп. условием для выборки.

наверное, в select вместо min
23 ноя 15, 15:34    [18460191]     Ответить | Цитировать Сообщить модератору
 Re: Сложный SQL запрос  [new]
gamadjo
Member

Откуда:
Сообщений: 24
Правильно ли будет заменить
min(stL.inidparent)

на
(SELECT top 1 FROM stLinks stL, uit_ActiveTP b where b.idTP = stL.inidparent and active = 1 as [TehPr])
23 ноя 15, 15:39    [18460232]     Ответить | Цитировать Сообщить модератору
 Re: Сложный SQL запрос  [new]
Glory
Member

Откуда:
Сообщений: 104760
gamadjo
В остальном, как мне кажется, нет нужды.

Вот откуда вам это кажется ?
Вы думаете, что эти Рекомендации писали люди, которым нечего больше делать?

gamadjo
И там огромные объемы данных.

Никому не нужны все ваши данные
23 ноя 15, 15:40    [18460240]     Ответить | Цитировать Сообщить модератору
 Re: Сложный SQL запрос  [new]
gamadjo
Member

Откуда:
Сообщений: 24
Вероятнее так правильнее:
(SELECT top 1 as [TehPr] FROM stLinks stL, uit_ActiveTP b where b.idTP = stL.inidparent and active = 1)
23 ноя 15, 15:43    [18460265]     Ответить | Цитировать Сообщить модератору
 Re: Сложный SQL запрос  [new]
gamadjo
Member

Откуда:
Сообщений: 24
SELECT stL.inidChild as [TehPr] FROM [Тяжмаш].[dbo].[stLinks] stL, [Тяжмаш].[dbo].[uit_ActiveTP] b where b.idTP = stL.inidparent and active = 1

Методом проб и ошибок я пришел к такому варианту. Что скажете? Похож на правду? :)
23 ноя 15, 15:50    [18460321]     Ответить | Цитировать Сообщить модератору
 Re: Сложный SQL запрос  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
gamadjo,

напишите case для ранжирования stL.inidparent и делайте агрегирование по этому case.
23 ноя 15, 15:50    [18460323]     Ответить | Цитировать Сообщить модератору
 Re: Сложный SQL запрос  [new]
Glory
Member

Откуда:
Сообщений: 104760
gamadjo
Что скажете? Похож на правду? :)

Вы предлагаете угадать, выдает ли ваш запрос нужные вам данные ?
Или что он оптимально решает неизвестную задачу ?
23 ноя 15, 15:53    [18460342]     Ответить | Цитировать Сообщить модератору
 Re: Сложный SQL запрос  [new]
gamadjo
Member

Откуда:
Сообщений: 24
Glory
gamadjo
Что скажете? Похож на правду? :)

Вы предлагаете угадать, выдает ли ваш запрос нужные вам данные ?
Или что он оптимально решает неизвестную задачу ?


            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) ');
23 ноя 15, 15:58    [18460378]     Ответить | Цитировать Сообщить модератору
 Re: Сложный SQL запрос  [new]
gamadjo
Member

Откуда:
Сообщений: 24
С тестовыми данными не смогу сделать, никак.

Блин, как объяснить-то.

Из нескольких переменных stL.inidparent выбирается одна путем использования функции min. Мне нужно, чтобы выбиралась так же одна (по-другому и не будет, т.е. удовлетворять условию всегда будет только одна из нескольких) такая, которая удовлетворяет вот такому условию:

SELECT stL.inidChild as [TehPr] FROM stLinks stL, uit_ActiveTP b where b.idTP = stL.inidparent and active = 1

Т.е. берется в качестве некого idTP и проверяется значение поля active, которое должно быть равно 1 с этим idTP = inidparent. То, у которого active = 1 нам и нужно.
23 ноя 15, 16:02    [18460405]     Ответить | Цитировать Сообщить модератору
 Re: Сложный SQL запрос  [new]
gamadjo
Member

Откуда:
Сообщений: 24
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]


Еще какая-нибудь информация нужна?
23 ноя 15, 16:05    [18460426]     Ответить | Цитировать Сообщить модератору
 Re: Сложный SQL запрос  [new]
Glory
Member

Откуда:
Сообщений: 104760
gamadjo
Еще какая-нибудь информация нужна?

и п.6
23 ноя 15, 16:06    [18460431]     Ответить | Цитировать Сообщить модератору
 Re: Сложный SQL запрос  [new]
gamadjo
Member

Откуда:
Сообщений: 24
Glory
gamadjo
Еще какая-нибудь информация нужна?

и п.6

На тестовых данных не получится никак. Без этого совсем никак не помочь?
23 ноя 15, 16:08    [18460442]     Ответить | Цитировать Сообщить модератору
 Re: Сложный SQL запрос  [new]
Ducha
Member

Откуда:
Сообщений: 7
gamadjo,

min(case when a.idTP = stL.inidparent and active = 1 then stL.inidparent end)

что-то вроде этого не подойдет?
23 ноя 15, 16:36    [18460620]     Ответить | Цитировать Сообщить модератору
 Re: Сложный SQL запрос  [new]
gamadjo
Member

Откуда:
Сообщений: 24
Ducha
gamadjo,

min(case when a.idTP = stL.inidparent and active = 1 then stL.inidparent end)

что-то вроде этого не подойдет?

Вроде получилось. Сейчас потестирую на нескольких вариантах. Спасибо!
23 ноя 15, 16:48    [18460697]     Ответить | Цитировать Сообщить модератору
 Re: Сложный SQL запрос  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31430
gamadjo
Из нескольких переменных stL.inidparent выбирается одна путем использования функции min. Мне нужно, чтобы выбиралась так же одна (по-другому и не будет, т.е. удовлетворять условию всегда будет только одна из нескольких) такая, которая удовлетворяет вот такому условию:

SELECT stL.inidChild as [TehPr] FROM stLinks stL, uit_ActiveTP b where b.idTP = stL.inidparent and active = 1


Т.е. берется в качестве некого idTP и проверяется значение поля active, которое должно быть равно 1 с этим idTP = inidparent. То, у которого active = 1 нам и нужно.
Да, если "удовлетворять условию всегда будет только одна из нескольких", то правильно. А GROU BY из запроса убрать.
23 ноя 15, 17:01    [18460785]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить