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

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

Нужно сгенерировать merge'ы запросом. К примеру из таблицы Т(а):
T:

|A|
---
|1|
|2|
|3|

В оракле сделал так :

select 'MERGE INTO T t USING ('
union all
select 'select '|| A || 'as A from dual union all' from 
(select * from T order by A asc)
where rownum <= (select count(*) - 1 from T)
union all
select 'select '|| A || 'as A from dual' from 
(select * from T order by A desc)
where rownum = 1
union all
select 'ON (...)' from dual
...


в MS SQL не могу использовать сортировку в inline view. Как мне получить последнюю строку для моего варианта или может это можно сделать как - нибудь подругому ?
27 фев 12, 13:13    [12156425]     Ответить | Цитировать Сообщить модератору
 Re: как получить последнюю строку ?  [new]
iap
Member

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

что надо-то?
Нифига же непонятно!
27 фев 12, 13:18    [12156473]     Ответить | Цитировать Сообщить модератору
 Re: как получить последнюю строку ?  [new]
Grayscale
Member

Откуда: Спб
Сообщений: 1647
А че бы не сделать SELECT TOP 1, Отсортировав в обратном порядке... ток этот чудо-оракал на T-SQL переписать бы :)
27 фев 12, 13:21    [12156504]     Ответить | Цитировать Сообщить модератору
 Re: как получить последнюю строку ?  [new]
Glory
Member

Откуда:
Сообщений: 104751
cumba
Нужно сгенерировать merge'ы запросом. К примеру из таблицы Т(а):
T:

|A|
---
|1|
|2|
|3|

Это исходные данные или конечные ?


cumba
В оракле сделал так :

И как это поможет понять вашу задачу ?


cumba
Как мне получить последнюю строку для моего варианта

Последняя строка - это первая при обратном порядке сортировки
27 фев 12, 13:22    [12156516]     Ответить | Цитировать Сообщить модератору
 Re: как получить последнюю строку ?  [new]
cumba
Member

Откуда:
Сообщений: 64
Сорри.
В MS SQL написал так

SELECT 'MERGE INTO dbo.T t USING ('
UNION ALL
SELECT TOP (select count(*)-1 from dbo.T) 'select '
+cast(A as varchar(255))
  +' as A union all'
FROM dbo.T
UNION ALL
...
/* 
вторым селектом получили count - 1 строк селектов вида

select 1 as A union all
select 2 as A union all

теперь нужно получить последнюю строку селект , которая НЕ будет содержать union all
select 3 as A
*/


проблема в том что не могу отсортировать ни отдельный селект ни подзапрос в разделе FROM (select * from T order by A asc desc) чтобы отобрать нужные строки.
А в оракловом запросе, отсортировал по возрастанию и получил count - 1 селектов, а потом отсортировал по убыванию и получил недостоющую строку.

В итоге должно получиться :
MERGE INTO T t USING (
SELECT 1 as A union all
SELECT 2 as A union all
SELECT 3 as A
) s ON (...)
27 фев 12, 13:49    [12156761]     Ответить | Цитировать Сообщить модератору
 Re: как получить последнюю строку ?  [new]
iljy
Member

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

блин, откуда берется эта привычка - использовать тематические форумы в качестве твиттера?? Вы рекомендации прочитали? Выполнить их способны?
27 фев 12, 14:04    [12156923]     Ответить | Цитировать Сообщить модератору
 Re: как получить последнюю строку ?  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
iljy
cumba,

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

Чувствую, всё закончится стандартной фразой ТС о качестве MSSQL по сравнению с великолепнейшим, непревзойдённым оракулом.
27 фев 12, 14:09    [12156999]     Ответить | Цитировать Сообщить модератору
 Re: как получить последнюю строку ?  [new]
cumba
Member

Откуда:
Сообщений: 64
iap,
Блин, хотелось по подробней, а получилось как всегда...

Суть:

Нужно сгенерировать MERGE для тадлицы Т(которую я привел выше)


Microsoft SQL Server 2008 (SP2) - 10.0.4000.0 (Intel X86)   Sep 16 2010 20:09:22   Copyright (c) 1988-2008 Microsoft Corporation  Enterprise Edition on Windows NT 5.2 <X86> (Build 3790: Service Pack 2) (VM).


Я надеюсь так тепереь на много лучше ?)
27 фев 12, 14:17    [12157069]     Ответить | Цитировать Сообщить модератору
 Re: как получить последнюю строку ?  [new]
Glory
Member

Откуда:
Сообщений: 104751
cumba
Я надеюсь так тепереь на много лучше ?)

Нет
Так и непонятно, что за порядок вам нужен.
Наверное нужно просто - https://www.sql.ru/faq/faq_topic.aspx?fid=130 ?
27 фев 12, 14:22    [12157127]     Ответить | Цитировать Сообщить модератору
 Re: как получить последнюю строку ?  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
Походу вопрос на счет кодогенерации))). Если меня не обманывает хрустальный шар.
27 фев 12, 14:24    [12157155]     Ответить | Цитировать Сообщить модератору
 Re: как получить последнюю строку ?  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
Как пример:
; WITH g AS (
SELECT number FROM master..spt_values WHERE type='p' AND number BETWEEN 1 AND 5
)
SELECT CASE WHEN number=1 THEN 'select ' ELSE 'union all select ' END+LTRIM(STR(number))+ ' AS A' FROM g

Ну а дальше for xml и в итоге будет то чего надобно)))
27 фев 12, 14:31    [12157227]     Ответить | Цитировать Сообщить модератору
 Re: как получить последнюю строку ?  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
А я подумал, что надо получить члены числового ряда, отсутствующие в таблице...
27 фев 12, 14:39    [12157331]     Ответить | Цитировать Сообщить модератору
 Re: как получить последнюю строку ?  [new]
cumba
Member

Откуда:
Сообщений: 64
Все таки сделал...

Теперь возникла другая проблема :

set IDENTITY_INSERT D.dbo.Tbl  ON

MERGE INTO D.dbo.Tbl as t USING (
select 1 as U_ID, '015' as S_CODE, '444' as S_VERSION, '444' as T_NAME, NULL as S_DS union all
select 2 as U_ID, '015' as S_CODE, '0.15' as S_VERSION, '1.15.001' as T_NAME, 'srthsrt' as S_DS union all
select 11 as U_ID, '815' as S_CODE, '5646' as S_VERSION, '34345' as T_NAME, 'dfbdfb' as S_DS union all
select 12 as U_ID, '015' as S_CODE, '4444' as S_VERSION, '5555' as T_NAME, 'dgjyd' as S_DS 
) as s
 ON (t.U_ID = s.U_ID)
WHEN MATCHED THEN UPDATE
SET t.S_VERSION = s.S_VERSION, t.S_DS = s.S_DS, t.T_NAME = s.T_NAME, t.S_CODE = s.S_CODE
WHEN NOT MATCHED THEN INSERT
VALUES (s.U_ID, s.S_VERSION, s.S_DS, s.T_NAME, s.S_CODE);


Msg 8101, Level 16, State 1, Line 1
An explicit value for the identity column in table 't' can only be specified when a column list is used and IDENTITY_INSERT is ON.
27 фев 12, 16:02    [12158077]     Ответить | Цитировать Сообщить модератору
 Re: как получить последнюю строку ?  [new]
Grayscale
Member

Откуда: Спб
Сообщений: 1647
column list is used надо в скобочках список столбцов после Т
27 фев 12, 16:05    [12158127]     Ответить | Цитировать Сообщить модератору
 Re: как получить последнюю строку ?  [new]
iap
Member

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

а так?
set IDENTITY_INSERT D.dbo.Tbl  ON;

MERGE INTO D.dbo.Tbl as t USING
(
select 1 as U_ID, '015' as S_CODE, '444' as S_VERSION, '444' as T_NAME, NULL as S_DS union all
select 2 as U_ID, '015' as S_CODE, '0.15' as S_VERSION, '1.15.001' as T_NAME, 'srthsrt' as S_DS union all
select 11 as U_ID, '815' as S_CODE, '5646' as S_VERSION, '34345' as T_NAME, 'dfbdfb' as S_DS union all
select 12 as U_ID, '015' as S_CODE, '4444' as S_VERSION, '5555' as T_NAME, 'dgjyd' as S_DS 
) as s
 ON (t.U_ID = s.U_ID)
WHEN MATCHED THEN UPDATE
SET t.S_VERSION = s.S_VERSION, t.S_DS = s.S_DS, t.T_NAME = s.T_NAME, t.S_CODE = s.S_CODE
WHEN NOT MATCHED THEN INSERT(U_ID,S_CODE,S_VERSION,T_NAME,S_DS)
VALUES (s.U_ID, s.S_VERSION, s.S_DS, s.T_NAME, s.S_CODE);
set IDENTITY_INSERT D.dbo.Tbl  ON;
Но если IDENTITY так мешает, зачем Вы его используете в таблице?
27 фев 12, 16:14    [12158203]     Ответить | Цитировать Сообщить модератору
 Re: как получить последнюю строку ?  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Grayscale
column list is used надо в скобочках список столбцов после Т
Пробовали?
27 фев 12, 16:14    [12158211]     Ответить | Цитировать Сообщить модератору
 Re: как получить последнюю строку ?  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Ошибся, конечно с выключением IDENTITY_INSERT
iap
cumba,

а так?
set IDENTITY_INSERT D.dbo.Tbl  ON;

MERGE INTO D.dbo.Tbl as t USING
(
select 1 as U_ID, '015' as S_CODE, '444' as S_VERSION, '444' as T_NAME, NULL as S_DS union all
select 2 as U_ID, '015' as S_CODE, '0.15' as S_VERSION, '1.15.001' as T_NAME, 'srthsrt' as S_DS union all
select 11 as U_ID, '815' as S_CODE, '5646' as S_VERSION, '34345' as T_NAME, 'dfbdfb' as S_DS union all
select 12 as U_ID, '015' as S_CODE, '4444' as S_VERSION, '5555' as T_NAME, 'dgjyd' as S_DS 
) as s
 ON (t.U_ID = s.U_ID)
WHEN MATCHED THEN UPDATE
SET t.S_VERSION = s.S_VERSION, t.S_DS = s.S_DS, t.T_NAME = s.T_NAME, t.S_CODE = s.S_CODE
WHEN NOT MATCHED THEN INSERT(U_ID,S_CODE,S_VERSION,T_NAME,S_DS)
VALUES (s.U_ID, s.S_VERSION, s.S_DS, s.T_NAME, s.S_CODE);

set IDENTITY_INSERT D.dbo.Tbl  OFF;
Но если IDENTITY так мешает, зачем Вы его используете в таблице?
27 фев 12, 16:16    [12158226]     Ответить | Цитировать Сообщить модератору
 Re: как получить последнюю строку ?  [new]
cumba
Member

Откуда:
Сообщений: 64
Да, надо было перечислить колонки
WHEN NOT MATCHED THEN INSERT(U_ID,S_CODE,S_VERSION,T_NAME,S_DS)

спасибо за помощь)
27 фев 12, 16:23    [12158311]     Ответить | Цитировать Сообщить модератору
 Re: как получить последнюю строку ?  [new]
iap
Member

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

но про "последнюю строку" (из названия темы) я всё равно ничего не понял.
27 фев 12, 16:25    [12158338]     Ответить | Цитировать Сообщить модератору
 Re: как получить последнюю строку ?  [new]
cumba
Member

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

если не включить IDENTITY_INSERT то
Cannot insert explicit value for identity column in table 'Tbl' when IDENTITY_INSERT is set to OFF.
27 фев 12, 16:27    [12158369]     Ответить | Цитировать Сообщить модератору
 Re: как получить последнюю строку ?  [new]
Glory
Member

Откуда:
Сообщений: 104751
iap
но про "последнюю строку" (из названия темы) я всё равно ничего не понял

У автора кодогенератор в конце созданного запроса оставлял "UNION ALL", потому что не мог отличить, что это "последняя" строка и не с чем больше делать "union"
27 фев 12, 16:28    [12158371]     Ответить | Цитировать Сообщить модератору
 Re: как получить последнюю строку ?  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
cumba
iap,

если не включить IDENTITY_INSERT то
Cannot insert explicit value for identity column in table 'Tbl' when IDENTITY_INSERT is set to OFF.
Так если Вы сами придумываете значения этому полю (U_ID),
то надо было его создавать БЕЗ свойства IDENTITY.
Тогда и выключать было бы нечего.
27 фев 12, 16:35    [12158463]     Ответить | Цитировать Сообщить модератору
 Re: как получить последнюю строку ?  [new]
cumba
Member

Откуда:
Сообщений: 64
да это у меня были свои "МЕГА" мысли... Сделал намного проще без всяких "последних строчек".
Нужно было вот это

select 'MERGE INTO D.dbo.T as t USING ('
UNION ALL
SELECT 'select '
  + CAST(A as varchar(255))
  +' as A '
  + case when rn != MAX(rn) over () then 'union all' else '' end
FROM (select *, ROW_NUMBER() OVER (ORDER BY UNLOAD_TEMPLATE_ID asc) as rn from D.dbo.T) t
UNION ALL
SELECT ') as s ON (t.A = s.A)'
UNION ALL
SELECT 'WHEN NOT MATCHED THEN INSERT (A)'
UNION ALL
SELECT 'VALUES (s.A);';


В другом варианте я хотел чтобы к последней строчке в таблице не приклеивалась 'union all' и все)
27 фев 12, 16:35    [12158468]     Ответить | Цитировать Сообщить модератору
 Re: как получить последнюю строку ?  [new]
cumba
Member

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

В точку )))
27 фев 12, 16:37    [12158492]     Ответить | Цитировать Сообщить модератору
 Re: как получить последнюю строку ?  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
cumba
В другом варианте я хотел чтобы к последней строчке в таблице не приклеивалась 'union all' и все)
можно было USING начинать с '(UNION ALL SELECT', а потом убрать REPLACEом '(UNION ALL '
27 фев 12, 16:46    [12158589]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить