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

Откуда: Киев
Сообщений: 5
Есть задача переписать БД с оракла на MS SQL2012. MS SQL знаю хорошо, а вот оракл первый раз вижу.
Пока благодаря гуглу все получается.. но наткнулся на такой вроде простенький запрос и не могу вкурить как его переписать на MS SQL. Кто может помочь?

select count(*) 
from (
select col1 from mytbl start with col1 in (1,2) connect by prior col1 = col2
intersect
select col1 from mytbl start with col1 in (3,4) connect by prior col1 = col2
)

Спасибо
P.S. in (1,2) и in (3,4) для примера, там могут быть любые значения...
11 дек 14, 11:53    [16982397]     Ответить | Цитировать Сообщить модератору
 Re: Как переписать запрос c Оракла на MS SQL  [new]
Владислав Колосов
Member

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

Вероятно, надо использовать LEAD или LAG. Не знаю точно.
11 дек 14, 12:03    [16982495]     Ответить | Цитировать Сообщить модератору
 Re: Как переписать запрос c Оракла на MS SQL  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
если я правильно понял
Ето подсчет елементов иерархии ( by prior col1 = col2
) для столбцов 1 и 2 для которых есть значения в колонках 3 и 4
ЗЫ Орацла не знаю
11 дек 14, 12:11    [16982573]     Ответить | Цитировать Сообщить модератору
 Re: Как переписать запрос c Оракла на MS SQL  [new]
Maxx
Member [скрыт]

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

легче помоему спросить в Оракловой ветке.. что возращает сей завпрос
11 дек 14, 12:12    [16982580]     Ответить | Цитировать Сообщить модератору
 Re: Как переписать запрос c Оракла на MS SQL  [new]
tosha1983
Member

Откуда: Киев
Сообщений: 5
Тут собственно даже с intersect все понятно.

Не могу понять именно вот этот кусочек, а их по коду такого вида очень много:
select col1 from mytbl start with col1 in (1,2) connect by prior col1 = col2


Чуствую тут надо как то с помощью with пытаться крутить...
11 дек 14, 12:20    [16982666]     Ответить | Цитировать Сообщить модератору
 Re: Как переписать запрос c Оракла на MS SQL  [new]
Добрый Э - Эх
Guest
tosha1983,

читай про рекурсивный CTE
11 дек 14, 12:29    [16982741]     Ответить | Цитировать Сообщить модератору
 Re: Как переписать запрос c Оракла на MS SQL  [new]
Добрый Э - Эх
Guest
tosha1983,

в оралке есть такое понятие, как иерархические запросы.
конструкция STAT WITH ... CONENCT BY ... - как раз оно и есть.
Иерархия => рекурсия. В MS SQL Server-а рекурсию делают с помощью рекурсивного СТЕ

STAT WITH - это анкерные узлы иерархии ("корни" деревьев), в СТЕ это будет в аккурат анкерная часть этого самого СТЕ, первая его половина, та что до UNION
CONNECT BY - это условие построения иерархии, отношение родитель => потомок, то есть непосредственно рекурсивная часть СТЕ (то что после UNION)
11 дек 14, 12:33    [16982781]     Ответить | Цитировать Сообщить модератору
 Re: Как переписать запрос c Оракла на MS SQL  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
select col1 from mytbl start with col1 in (1,2) connect by prior col1 = col2


Должно стать чем=то таким

WITH Q AS 
( 
	select col1, col2 from mytbl start -- изначальный запрос
)
,Q1 AS 
(
	SELECT col1, col2 FROM Q WHERE col1 in (1,2) -- корни дерева
	UNION ALL  
	SELECT Q.col1, Q.col2 FROM Q1 -- ветвление 
	INNER JOIN Q ON Q1.col1 = Q.col2
) 
SELECT * FROM Q


В деталях мог наврать, но общий вид запроса должен получиться такой
11 дек 14, 14:19    [16983575]     Ответить | Цитировать Сообщить модератору
 Re: Как переписать запрос c Оракла на MS SQL  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
a_voronin
select col1 from mytbl start with col1 in (1,2) connect by prior col1 = col2



Должно стать чем=то таким

WITH Q AS 
( 
	select col1, col2 from mytbl start -- изначальный запрос
)
,Q1 AS 
(
	SELECT col1, col2 FROM Q WHERE col1 in (1,2) -- корни дерева
	UNION ALL  
	SELECT Q.col1, Q.col2 FROM Q1 -- ветвление 
	INNER JOIN Q ON Q1.col1 = Q.col2
) 
SELECT * FROM Q



В деталях мог наврать, но общий вид запроса должен получиться такой
Это зачем же здесь Q??
11 дек 14, 14:29    [16983665]     Ответить | Цитировать Сообщить модератору
 Re: Как переписать запрос c Оракла на MS SQL  [new]
a_voronin
Member

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

Напишите правильно, если вы такой умный
11 дек 14, 14:29    [16983671]     Ответить | Цитировать Сообщить модератору
 Re: Как переписать запрос c Оракла на MS SQL  [new]
iap
Member

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

Напишите правильно, если вы такой умный
Вот только хамить не надо!
WITH Q AS 
(
	SELECT col1, col2 FROM mytbl WHERE col1 in (1,2) -- корни дерева
	UNION ALL  
	SELECT mytbl.col1, mytbl.col2 FROM mytbl
	JOIN Q ON mytbl.col1=Q.col2
) 
SELECT * FROM Q;
11 дек 14, 14:44    [16983792]     Ответить | Цитировать Сообщить модератору
 Re: Как переписать запрос c Оракла на MS SQL  [new]
Glory
Member

Откуда:
Сообщений: 104760
a_voronin
Напишите правильно, если вы такой умный

start - это не псевдоним таблицы, это часть синтаксиса рекурсивного запроса
11 дек 14, 14:47    [16983810]     Ответить | Цитировать Сообщить модератору
 Re: Как переписать запрос c Оракла на MS SQL  [new]
LexusR
Member

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

Напишите правильно, если вы такой умный


что за нервная реакция на вопрос... :)

я тоже не понял

если Вы написали рекурсивный запрос то как то странно
declare @mytbl table(col1 int,col2 int)
insert into @mytbl(col1,col2)values(1,10),(2,20),(3,1),(4,2),(5,7),(6,8)
-- это ВАШ запрос
;WITH Q AS 
( 
	select col1, col2 from @mytbl start -- изначальный запрос
)
,Q1 AS 
(
	SELECT col1, col2 FROM Q WHERE col1 in (1,2) -- корни дерева
	UNION ALL  
	SELECT Q.col1, Q.col2 FROM Q1 -- ветвление 
	INNER JOIN Q ON Q1.col1 = Q.col2
) 
SELECT * FROM Q
 -- а по видимому предполагалось что-то такое
;with start(col1, col2) as
(select col1, col2 from @mytbl 
 where col1 in (1,2)
 union all
 select t.col1, t.col2 from @mytbl t
 join start s on s.col1=t.col2
)select * from start
11 дек 14, 14:47    [16983814]     Ответить | Цитировать Сообщить модератору
 Re: Как переписать запрос c Оракла на MS SQL  [new]
a_voronin
Member

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

ну вот и хорошо
11 дек 14, 15:02    [16983913]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить