Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Insert into, select и скобки  [new]
VladislavVV
Member

Откуда:
Сообщений: 985
привет всем

есть insert во времянку
работает
 --вливаем записи об арх переводах
 INSERT INTO #OK_PRN_PerevodyOnly_temp
            (
         	 [PerevodDate], [NameCeh], [NamePodr], [NameDolzh], [NameRazrOklad],
            [Osnovanie]
            )

             SELECT PA.[DatePArch], PA.[Ceh], '', PA.[Dolzh], PA.[RazrOklad],
                    PA.[Osnovanie]
             FROM [dbo].[OK_WTB_PerevodArch] AS PA
             WHERE PA.[IDTrud]=@IDTrud AND
                   PA.[PererodStatus]<>0
             ORDER BY PA.[DatePArch] ASC 

вот так-не работает
 --вливаем записи об арх переводах
 INSERT INTO #OK_PRN_PerevodyOnly_temp
            (
         	 [PerevodDate], [NameCeh], [NamePodr], [NameDolzh], [NameRazrOklad],
            [Osnovanie]
            )
           (
             SELECT PA.[DatePArch], PA.[Ceh], '', PA.[Dolzh], PA.[RazrOklad],
                    PA.[Osnovanie]
             FROM [dbo].[OK_WTB_PerevodArch] AS PA
             WHERE PA.[IDTrud]=@IDTrud AND
                   PA.[PererodStatus]<>0
             ORDER BY PA.[DatePArch] ASC 
            )
если убрать ORDER BY то работает, но мне надо с ORDER BY.

вопрос:
как влияют скобки на ORDER BY?
и в скобках ли причина?
2 окт 09, 11:57    [7733900]     Ответить | Цитировать Сообщить модератору
 Re: Insert into, select и скобки  [new]
Glory
Member

Откуда:
Сообщений: 104760
Не знаю, откуда вы выкопали такой синтаксис со скобками, но в хелпе его нет
2 окт 09, 11:59    [7733917]     Ответить | Цитировать Сообщить модератору
 Re: Insert into, select и скобки  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
VladislavVV
мне надо с ORDER BY.
Зачем?
2 окт 09, 11:59    [7733920]     Ответить | Цитировать Сообщить модератору
 Re: Insert into, select и скобки  [new]
VladislavVV
Member

Откуда:
Сообщений: 985
Glory
Не знаю, откуда вы выкопали такой синтаксис со скобками, но в хелпе его нет

да вроде всегда со скобками ваял, order by не нужен был, а тут на такой косяк наткнулся
может по аналогии с insert () ... values() ?
2 окт 09, 12:04    [7733965]     Ответить | Цитировать Сообщить модератору
 Re: Insert into, select и скобки  [new]
VladislavVV
Member

Откуда:
Сообщений: 985
Паганель
VladislavVV
мне надо с ORDER BY.
Зачем?

ну вот, началось... :-) хоть и пятница, но шаманские танцы с бубном для удовлетворения запросов ОК продолжаются. процедура имеет продолжение в виде еще одного инсерта с другой таблицы... долгая история.
2 окт 09, 12:06    [7733985]     Ответить | Цитировать Сообщить модератору
 Re: Insert into, select и скобки  [new]
Glory
Member

Откуда:
Сообщений: 104760
VladislavVV
Glory
Не знаю, откуда вы выкопали такой синтаксис со скобками, но в хелпе его нет

да вроде всегда со скобками ваял, order by не нужен был, а тут на такой косяк наткнулся
может по аналогии с insert () ... values() ?

Укажите источник, на основании которого такой синтаксис вообще возможен
2 окт 09, 12:07    [7733995]     Ответить | Цитировать Сообщить модератору
 Re: Insert into, select и скобки  [new]
Glory
Member

Откуда:
Сообщений: 104760
VladislavVV
Паганель
VladislavVV
мне надо с ORDER BY.
Зачем?

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

А ORDER BY то зачем ? Что он дает вам ?
2 окт 09, 12:08    [7734001]     Ответить | Цитировать Сообщить модератору
 Re: Insert into, select и скобки  [new]
VladislavVV
Member

Откуда:
Сообщений: 985
Glory

Укажите источник, на основании которого такой синтаксис вообще возможен

мда... и правда, в бол написано

Use a SELECT subquery to specify the data values for one or more rows. 
INSERT INTO MyTable  (PriKey, Description)
       SELECT ForeignKey, Description
       FROM SomeView
не доглядел со скобками
просто провел аналогию синтаскиса INSERT INTO () values ()
Use a VALUES clause to specify the data values for one row: 
INSERT INTO MyTable (PriKey, Description)
       VALUES (123, 'A description of part 123.')

и "прилепил" этот синтаксис к виду insert ... select from

зачем нужен order by

из пары таблиц, одна-архивы переводов, другая - переводы лепим запрос, возвращающий записи о переводах с пронумерованныи списком и флагом последней записи. этот изврат требуется для проверяющего, который боится компа как огня и все хочет видеть на листочках. В кадровской форме П2 на обратной стороне надо будет допечатывать последнюю запись о переводах-вот и нужен такой запрос.

тело процедуры
/*
--------------------------------------------------------------------------------
TYPE         : BROWSE
OBJECT       : [dbo].[up_OK_PRN_PerevodyOnly]
--------------------------------------------------------------------------------
Description  : Процедура возвращает набор записей переводов работника, как
               архивных так и актуальных с нумерацией
               (используется для печати обратки формы П-2, в частности печати
               только последней записи)
--------------------------------------------------------------------------------
CREATE DATE  : 01-10-2009
AUTOR        : Vlad. V. Volosozhar
--------------------------------------------------------------------------------
PARAMETERS   : @Help  char(2)=null ("NH"-no need help show)
               @Debug char(3)="OFF"/"ON"
--------------------------------------------------------------------------------
*/

CREATE PROCEDURE [dbo].[up_OK_PRN_PerevodyOnly]
                                        @Help  char(2)=null,
                                        @Debug char(3)='OFF',
                                        
                                        @IDTrud int

AS
BEGIN

 IF @Help IS NULL GOTO Help
 IF @Debug='ON' PRINT 'Dedug=ON'
 
 DECLARE @RecCount int
 SET @RecCount=0
 
 --определяем кол-во записей----------------------------------------------------
 SELECT @RecCount=COUNT(SubQuery.[ID])
 FROM
     (
      SELECT PA.[IDPArch] AS [ID]
      FROM [dbo].[OK_WTB_PerevodArch] AS PA
      WHERE PA.[IDTrud]=@IDTrud AND
            PA.[PererodStatus]<>0
            
      UNION ALL
 
      SELECT P.[IDPerevod]  AS [ID]
      FROM [dbo].[OK_WTB_Perevod] AS P
      WHERE P.[IDTrud]=@IDTrud AND
            P.[PerevodStatus]=1
     ) AS  SubQuery

 IF @Debug='ON' PRINT '@RecCount='+CAST(@RecCount AS CHAR(10))

 --создаем врем таблицу---------------------------------------------------------
 CREATE TABLE #OK_PRN_PerevodyOnly_temp
   (	
	[IDRec]         [int] IDENTITY (1, 1) NOT NULL ,
	[PerevodDate]   [smalldatetime] NOT NULL ,
    [NameCeh]       [char] (100) COLLATE Cyrillic_General_CI_AS NOT NULL,
    [NamePodr]      [char] (100) COLLATE Cyrillic_General_CI_AS NOT NULL,
    [NameDolzh]     [char] (100) COLLATE Cyrillic_General_CI_AS NOT NULL,
    [NameRazrOklad] [char] (100) COLLATE Cyrillic_General_CI_AS NOT NULL,
    [Osnovanie]     [char] (100) COLLATE Cyrillic_General_CI_AS NOT NULL
   )
    
 --вливаем записи об арх переводах
 INSERT INTO #OK_PRN_PerevodyOnly_temp
            (
         	[PerevodDate], [NameCeh], [NamePodr], [NameDolzh], [NameRazrOklad],
            [Osnovanie]
            )

             SELECT PA.[DatePArch], PA.[Ceh], '', PA.[Dolzh], PA.[RazrOklad],
                    PA.[Osnovanie]
             FROM [dbo].[OK_WTB_PerevodArch] AS PA
             WHERE PA.[IDTrud]=@IDTrud AND
                   PA.[PererodStatus]<>0
             ORDER BY PA.[DatePArch] ASC

 --вливаем записи об переводах
 INSERT INTO #OK_PRN_PerevodyOnly_temp
            (
         	[PerevodDate], [NameCeh], [NamePodr], [NameDolzh], [NameRazrOklad],
            [Osnovanie]
            )

             SELECT P.[PerevodDate], C.[NameCeh], D.[NamePodr], E.[NameDol],
                    RTRIM(F.[NameRazr])+CHAR(13)+
                    RTRIM(CAST(B.[Oklad] AS CHAR(12))) AS [NameRazrOklad],
                    P.[PerevodPrikaz]
                    
             FROM [dbo].[OK_WTB_Perevod] AS P
                  LEFT OUTER JOIN [dbo].[SR_ALL_Main] AS B
                  ON P.[IDmain]=B.[IDmain]
                  LEFT OUTER JOIN [dbo].[SR_ALL_Ceh] AS C
                  ON B.[IDCeh]=C.[IDCeh]
                  LEFT OUTER JOIN [dbo].[SR_ALL_Podr] AS D
                  ON B.[IDpodr]=D.[IDpodr]
                  LEFT OUTER JOIN [dbo].[SR_ALL_Dolzh] AS E
                  ON B.[IDDolzh]=E.[IDDolzh]
                  LEFT OUTER JOIN [dbo].[SR_ALL_Razr]  AS F
                  ON B.[IDRazr]=F.[IDRazr]
             WHERE P.[IDTrud]=@IDTrud AND
                   P.[PerevodStatus]=1
             ORDER BY P.[IDPerevod] ASC

 --основной запрос
 SELECT [IDRec],	
         CASE
          WHEN [IDRec]=@RecCount THEN 1
          ELSE 0
         END AS [IDRecFlag],
          [PerevodDate], [NameCeh], [NamePodr], [NameDolzh], [NameRazrOklad],
          [Osnovanie]
 FROM #OK_PRN_PerevodyOnly_temp
 ORDER BY [IDRec] ASC

 --прибиваем времянку
 DROP TABLE #OK_PRN_PerevodyOnly_temp
 
 GOTO EndProc

Help:
 PRINT '--------------------------------------------------------------------------------'
 PRINT 'Description  : Процедура возвращает набор записей переводов работника, как      '
 PRINT '               архивных так и актуальных с нумерацией                           '
 PRINT '               (используется для печати обратки формы П-2, в частности печати   '
 PRINT '               только последней записи)                                         '
 PRINT '--------------------------------------------------------------------------------'
 RETURN -1

EndProc:
END

вот результат
IDRec	IDRecFlag	PerevodDate	NameCeh	NamePodr	NameDolzh	NameRazrOklad	Osnovanie
1	0	23.04.1975	Участок 1	""	транспортная рабочая	Данных нет	Приказ 31 от 21.04.75
2	0	17.01.1977	управление	""	кассир	Данных нет	Приказ 5 от 10.01.77
3	0	09.10.1978	управление	""	старший инспектор ОК	""	Пр. 88-к от 30.04.78
4	0	01.07.1991	Управление	""	начальник ОК	Данных нет	Пр. 12 от 1.07.1991
5	0	01.06.1996	Управление	""	Старший инспектор ОК	Данных нет	Пр.13-к от 4.06.96
6	0	21.02.2006	Управление	""	Начальник ОК	Данных нет	Пр. 2 от 21.02.2006
7	0	01.04.2009	Аппарат	03. Отдел кадров	Начальник отдела кадров	"?
1260.00"	Пер. №101 на 33 ч.р.неделю
8	1	01.06.2009	Аппарат	03. Отдел кадров	Начальник отдела кадров	"?
1260.00"	Пер. № 238на 8 час.раб.день
короче-изврат, но пока только он подходит
2 окт 09, 12:20    [7734095]     Ответить | Цитировать Сообщить модератору
 Re: Insert into, select и скобки  [new]
Glory
Member

Откуда:
Сообщений: 104760
VladislavVV

зачем нужен order by

из пары таблиц, одна-архивы переводов, другая - переводы лепим запрос, возвращающий записи о переводах с пронумерованныи списком и флагом последней записи. этот изврат требуется для проверяющего, который боится компа как огня и все хочет видеть на листочках. В кадровской форме П2 на обратной стороне надо будет допечатывать последнюю запись о переводах-вот и нужен такой запрос.

Так и не понял, зачем нужен order by в insert-е, если конечный select и так использует свой order by
2 окт 09, 12:27    [7734149]     Ответить | Цитировать Сообщить модератору
 Re: Insert into, select и скобки  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
Пробовали ли Вы обойтись одним запросом?

(если версия сервера >= 2005, то это даже легче...)
2 окт 09, 12:27    [7734151]     Ответить | Цитировать Сообщить модератору
 Re: Insert into, select и скобки  [new]
VladislavVV
Member

Откуда:
Сообщений: 985
Glory
VladislavVV

зачем нужен order by

из пары таблиц, одна-архивы переводов, другая - переводы лепим запрос, возвращающий записи о переводах с пронумерованныи списком и флагом последней записи. этот изврат требуется для проверяющего, который боится компа как огня и все хочет видеть на листочках. В кадровской форме П2 на обратной стороне надо будет допечатывать последнюю запись о переводах-вот и нужен такой запрос.

Так и не понял, зачем нужен order by в insert-е, если конечный select и так использует свой order by

да, не дописал
дело в том, что записи в таблицах переводов могут идти не отсортированными, те проще в инсертах всунуть order by, чем результирующую сортировать (проще не в смысле затрат сервера на сортировку, проще в смысле надежнее)-в моем случае я 100% получаю последней запись ту, которая действельно последняя и ставлю на нее флаг
2 окт 09, 12:35    [7734227]     Ответить | Цитировать Сообщить модератору
 Re: Insert into, select и скобки  [new]
VladislavVV
Member

Откуда:
Сообщений: 985
Паганель
Пробовали ли Вы обойтись одним запросом?

(если версия сервера >= 2005, то это даже легче...)

server -2k
одним запросом где? в инсерте? через union all? а что это даст?
2 окт 09, 12:38    [7734256]     Ответить | Цитировать Сообщить модератору
 Re: Insert into, select и скобки  [new]
Konst_One
Member

Откуда:
Сообщений: 11515
а с чего вы решили что insert будет юзать при вставке вашу сортировку?
2 окт 09, 12:38    [7734262]     Ответить | Цитировать Сообщить модератору
 Re: Insert into, select и скобки  [new]
VladislavVV
Member

Откуда:
Сообщений: 985
Konst_One
а с чего вы решили что insert будет юзать при вставке вашу сортировку?

записи будут вставлять во времянку из select, который отсортирован Order By. разве не так?
2 окт 09, 12:43    [7734323]     Ответить | Цитировать Сообщить модератору
 Re: Insert into, select и скобки  [new]
ПростоМимоПроходил
Guest
Добавтьте TOP 100 PERCENT в подзапрос.
2 окт 09, 12:52    [7734424]     Ответить | Цитировать Сообщить модератору
 Re: Insert into, select и скобки  [new]
Albatross
Member

Откуда:
Сообщений: 997
VladislavVV

да, не дописал
дело в том, что записи в таблицах переводов могут идти не отсортированными, те проще в инсертах всунуть order by, чем результирующую сортировать (проще не в смысле затрат сервера на сортировку, проще в смысле надежнее)-в моем случае я 100% получаю последней запись ту, которая действельно последняя и ставлю на нее флаг


Если у Вас в результирующем запросе не будет order by, то никакого упорядочивания там не гарантируется. Записи могут возвратиться в любом порядке, неважно, как Вы их там вставляли. Если сегодня выводит в правильном порядке, не факт, что завтра не вернёт в неправильном.
2 окт 09, 12:57    [7734485]     Ответить | Цитировать Сообщить модератору
 Re: Insert into, select и скобки  [new]
Konst_One
Member

Откуда:
Сообщений: 11515
VladislavVV
Konst_One
а с чего вы решили что insert будет юзать при вставке вашу сортировку?

записи будут вставлять во времянку из select, который отсортирован Order By. разве не так?


сервер не гарантирует порядок вставки из select
2 окт 09, 12:57    [7734486]     Ответить | Цитировать Сообщить модератору
 Re: Insert into, select и скобки  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5111
то VladislavVV
правильно ли я понял, что все пляски с бубном за ради того чтобы найти запись из [dbo].[OK_WTB_Perevod] с максимальным [IDPerevod] для условий [IDTrud]=@IDTrud AND [PerevodStatus]=1 ?

--------------------------------------------------------------
Дьявол кроется в деталях.
2 окт 09, 12:59    [7734506]     Ответить | Цитировать Сообщить модератору
 Re: Insert into, select и скобки  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
VladislavVV
server -2k
Да, с "одним запросом" что-то я поспешил
В случае с 2000 без временной таблицы будет, скорее всего, медленнее (про курсоры не знаю)

Хотел бы только обратить Ваше внимаение на некоторые, на мой взгляд, странности:

1) Вы считаете количество данных и выбираете потом эти данные по-разному
(при подсчете количества left join-ы отсутствуют, а при выборке данных - есть)

2) Возможно, достаточно было бы для подсчета количества
просто взять count(*) по временной таблице после ее заполнения

3) Вы пытаетесь нумеровать записи из OK_WTB_PerevodArch по полю DatePArch
а из OK_WTB_Perevod уже по полю IDPerevod, хотя там есть PerevodDate
(я не утверждаю, что это ошибка, может так и надо, просто обращаю внимание)
2 окт 09, 13:00    [7734513]     Ответить | Цитировать Сообщить модератору
 Re: Insert into, select и скобки  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
Дедушка
все пляски с бубном за ради того чтобы найти запись из [dbo].[OK_WTB_Perevod] с максимальным [IDPerevod] для условий [IDTrud]=@IDTrud AND [PerevodStatus]=1 ?
Вопрос не ко мне, но рискну предположить, что нет
К сожалению, автору нужно выдать еще и нумерованный набор данных
VladislavVV
Description  : Процедура возвращает набор записей переводов работника, как
               архивных так и актуальных с нумерацией
2 окт 09, 13:04    [7734555]     Ответить | Цитировать Сообщить модератору
 Re: Insert into, select и скобки  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5111
Паганель
VladislavVV
server -2k

1) Вы считаете количество данных и выбираете потом эти данные по-разному
(при подсчете количества left join-ы отсутствуют, а при выборке данных - есть)

могу ошибаться, но условия фильтрации и там и там одинаковые.
т.е. лефт джоины не изменят количества строк.
2 окт 09, 13:06    [7734570]     Ответить | Цитировать Сообщить модератору
 Re: Insert into, select и скобки  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
Дедушка
могу ошибаться, но условия фильтрации и там и там одинаковые.
т.е. лефт джоины не изменят количества строк.
Одно из другого не следует
+ пример
declare @t1 table(id int)
insert into @t1(id)
select 1 union all
select 2

declare @t2 table(id int)
insert into @t2(id)
select 1 union all
select 1

select count(*) as [count]
  from @t1 as t1
 where t1.id = 1
 
select t1.id
  from @t1 as t1
  left join @t2 as t2 on t2.id = t1.id
 where t1.id = 1

count
-----------
1

(1 row(s) affected)

id
-----------
1
1

(2 row(s) affected)
Надеюсь, у автора не так
2 окт 09, 13:11    [7734622]     Ответить | Цитировать Сообщить модератору
 Re: Insert into, select и скобки  [new]
VladislavVV
Member

Откуда:
Сообщений: 985
ух ты как все поворачивается. :-)


Добавтьте TOP 100 PERCENT в подзапрос.

ща попробую


то VladislavVV
правильно ли я понял, что все пляски с бубном за ради того чтобы найти запись из [dbo].[OK_WTB_Perevod] с максимальным [IDPerevod] для условий [IDTrud]=@IDTrud AND [PerevodStatus]=1 ?

почти
не только найти, а склеить записи из таблицы архивов с записями таблицы переводов в таокм порядке

1. архивная запись 1
2. архивная запись 2
...
N. архивная запись N
N+1 запись о переводе 1
N+2 запись о переводе 2
...
N+X запись о переводе - последняя -она же актуальное место работы сейчас-имеет flag=1
остальные записи омеют flag=0

1) Вы считаете количество данных и выбираете потом эти данные по-разному
(при подсчете количества left join-ы отсутствуют, а при выборке данных - есть)

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


2) Возможно, достаточно было бы для подсчета количества
просто взять count(*) по временной таблице после ее заполнения


нет
в этом куске процедуры надо @RecCount знать заранее, имхо так удобнее выставить флаг
 --основной запрос
 SELECT [IDRec],	
         CASE
          WHEN [IDRec]=@RecCount THEN 1
          ELSE 0
         END AS [IDRecFlag],
          [PerevodDate], [NameCeh], [NamePodr], [NameDolzh], [NameRazrOklad],
          [Osnovanie]
 FROM #OK_PRN_PerevodyOnly_temp


3) Вы пытаетесь нумеровать записи из OK_WTB_PerevodArch по полю DatePArch
а из OK_WTB_Perevod уже по полю IDPerevod, хотя там есть PerevodDate
(я не утверждаю, что это ошибка, может так и надо, просто обращаю внимание)

да, тут нет ошибки
в архивной таблице посл запись будет по макс дате, в таблице переводов-по макс ID - так сконструировано и реализовано бизнес логикой
2 окт 09, 13:13    [7734645]     Ответить | Цитировать Сообщить модератору
 Re: Insert into, select и скобки  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
VladislavVV
в этом куске процедуры надо @RecCount знать заранее, имхо так удобнее выставить флаг
 --основной запрос
 SELECT [IDRec],	
         CASE
          WHEN [IDRec]=@RecCount THEN 1
          ELSE 0
         END AS [IDRecFlag],
          [PerevodDate], [NameCeh], [NamePodr], [NameDolzh], [NameRazrOklad],
          [Osnovanie]
 FROM #OK_PRN_PerevodyOnly_temp
И что мешает перед этим "основным запросом" выполнить
select @RecCount = count(*) from #OK_PRN_PerevodyOnly_temp
?
2 окт 09, 13:17    [7734688]     Ответить | Цитировать Сообщить модератору
 Re: Insert into, select и скобки  [new]
VladislavVV
Member

Откуда:
Сообщений: 985
Паганель
VladislavVV
в этом куске процедуры надо @RecCount знать заранее, имхо так удобнее выставить флаг
 --основной запрос
 SELECT [IDRec],	
         CASE
          WHEN [IDRec]=@RecCount THEN 1
          ELSE 0
         END AS [IDRecFlag],
          [PerevodDate], [NameCeh], [NamePodr], [NameDolzh], [NameRazrOklad],
          [Osnovanie]
 FROM #OK_PRN_PerevodyOnly_temp
И что мешает перед этим "основным запросом" выполнить
select @RecCount = count(*) from #OK_PRN_PerevodyOnly_temp
?


ничего не мешает :-)
2 окт 09, 13:33    [7734846]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить