Форум программистов, компьютерный форум, киберфорум
Oracle
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.67/21: Рейтинг темы: голосов - 21, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 12.02.2016
Сообщений: 54

Перевести из ms sql server в oracle

12.02.2016, 00:42. Показов 5179. Ответов 83
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
есть процедура и запрос
T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
declare @DishName varchar(250)='Борщ';
declare @DishId int;
select @DishId = idDish from Dish where NameOfDish = @DishName;
 
with a as
(
select idZakaz from WhatToZakaz where idDish = @DishId
),
b as
(
select top(1) w.idDish
  from a join WhatToZakaz w on w.idZakaz = a.idZakaz
  where w.idDish <> @DishId
  group by w.idDish
  order by count(number) desc
)
select d.NameOfDish
 from b inner join Dish d on d.idDish = b.idDish;
END
T-SQL
1
2
3
4
5
6
7
8
9
10
11
SELECT top 1 with  ties datepart(dw,Zakaz.date1) AS Дата,
Max(WhatToZakaz.number) AS [Max-Количество],
Dish.NameOfDish
FROM Stuff1 inner  JOIN (Zakaz inner JOIN (Dish inner JOIN WhatToZakaz 
ON Dish.idDish = WhatToZakaz.idDish)
ON Zakaz.idZakaz = WhatToZakaz.idZakaz) 
ON Stuff1.idStuff = Zakaz.idStuff
GROUP BY  NameOfDish, Zakaz.date1
order by rank()
over(partition by datepart(dw,Zakaz.date1)
order by max(WhatToZakaz.number) desc)
помоги перевести на язык oracle(только начал изучение и ступор)
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.02.2016, 00:42
Ответы с готовыми решениями:

Oracle SQL Server
Есть ли возможность каким-то образом поработать с ним из-под обычной винды? У MS есть спец. редакции, здесь же я скачал oracle developer...

Экспорт из Oracle в MS SQL Server
Нужно експортировать базу данных из Oracle в MS SQL Server. Експорт и импорт должен осуществляться командным файлом Windows. Помогите

Переписать из Oracle в SQL SERVER
CREATE OR REPLACE TRIGGER Trigger_Section BEFORE DELETE ON Sections FOR EACH ROW DECLARE @CNT integer SET @CNT = 0; LINK_EXIST...

83
0 / 0 / 0
Регистрация: 12.02.2016
Сообщений: 54
12.02.2016, 13:13  [ТС]
Студворк — интернет-сервис помощи студентам
хорошо, а зачем в функции по выборам блюд даты? это 2 разных должны быть
0
765 / 666 / 194
Регистрация: 24.11.2015
Сообщений: 2,163
12.02.2016, 13:20
Цитата Сообщение от Max913 Посмотреть сообщение
выборам блюд даты
Вы можете захотеть посмотреть данные за текущую неделю, а можете захотеть посмотреть данные за первую неделю года
SQL
1
2
3
4
5
SELECT b.idDish, b.NameOfDish -- наиболее часто сопутствующее блюдо
FROM Dish a,
Dish b
WHERE b.idDish = frend_dish(a.idDish,'ww')
AND a.idDish ="id Борща";    -- текущая неделя
SQL
1
2
3
4
5
SELECT b.idDish, b.NameOfDish -- наиболее часто сопутствующее блюдо
FROM Dish a,
Dish b
WHERE b.idDish = frend_dish(a.idDish,'ww', to_date('201601','yyyymm'))
AND a.idDish ="id Борща";    -- неделя, включающая 1 января
Вы одну и ту же функцию можете использовать по-разному
SQL
1
2
3
4
5
SELECT b.idDish, b.NameOfDish -- наиболее часто сопутствующее блюдо
FROM Dish a,
Dish b
WHERE b.idDish = frend_dish(a.idDish,'yy', to_date('201501','yyyymm'))
AND a.idDish ="id Борща";    -- а так вы возьмете данные за весь прошлый год
для недели надо писать 'ww', если пришите 'w' - это будет неделя месяца (от 1 до 5), а если 'ww' - неделя года, от 1 до 52
0
0 / 0 / 0
Регистрация: 12.02.2016
Сообщений: 54
12.02.2016, 13:24  [ТС]
понял, в функции он ругает
SELECT idDish INTO vDishId FROM (

Error at line 12: PL/SQL: SQL Statement ignored
0
765 / 666 / 194
Регистрация: 24.11.2015
Сообщений: 2,163
12.02.2016, 13:27
А так вы по трем блюдам найдете сопутствующие блюда за весь прошлый год
SELECT a.idDish, a.NameOfDish, -- базовое блюдо
b.idDish, b.NameOfDish -- наиболее часто сопутствующее блюдо
FROM Dish a,
Dish b
WHERE b.idDish = return_name(a.idDish,'w', to_date('201501','yyyymm')))
and a.idDish in ("idБорща", "idКотлет", "idШашлыка");

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

Добавлено через 1 минуту
Цитата Сообщение от Max913 Посмотреть сообщение
понял, в функции он ругает
SELECT idDish INTO vDishId FROM (
Пришлите мне весь текст оракловой функции, который у Вас сейчас в базе. Посмотрим, что там получилось
0
0 / 0 / 0
Регистрация: 12.02.2016
Сообщений: 54
12.02.2016, 13:29  [ТС]
Oracle 11 SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
CREATE OR REPLACE FUNCTION frend_dish(pDishId  IN  NUMBER, 
                                      fmt IN VARCHAR2, 
                                      pBaseDate IN DATE DEFAULT TRUNC(SYSDATE))
-- Входные параметры:    pDishId - код тестируемого блюда
--                       fmt     - маска: 'ww' - неделя с начала года, 'mm' - месяц, 'q' -квартал, 'yy' - календарный год
--                      pBaseDate- базовая дата, для определения недели, месяца и т.д. Если не вводится - берется текущая дата
-- Выходное значение:   (number) - код наиболее часто заказываемого блюда из того же заказа, кроме тестируемого
RETURN NUMBER
IS 
    vDishId      NUMBER;
BEGIN     
    SELECT idDish INTO vDishId FROM (
    SELECT idDish, ROW_NUMBER() OVER (ORDER BY cnt DESC) nn
    FROM (
    SELECT w.idDish, COUNT(*) cnt  -- как вариант, можно COUNT(distinct z.idZakaz) - выбор варианта зависит от возможности повторения блюд в заказе
    FROM Zakaz z,
         WhatToZakaz w,
         WhatToZakaz b
    WHERE w.idZakaz = z.idZakaz
      AND b.idZakaz = z.idZakaz
      AND w.idDish <> pDishId
      AND b.iddish =  pDishId
      AND TRUNC(z.date1, fmt) = TRUNC(pBaseDate, fmt)
    GROUP BY w.idDish
    ) WHERE nn=1);
    RETURN vDishId;
EXCEPTION
    WHEN OTHERS THEN
    RETURN NULL;    
END;
получилась

у меня 17 блюд, разве они не должны автоматически искать?
0
765 / 666 / 194
Регистрация: 24.11.2015
Сообщений: 2,163
12.02.2016, 13:44
Ну что могу сказать? Если ..., то это надолго. Опять не там скобку поставил
)) WHERE nn=1;

Добавлено через 2 минуты
Цитата Сообщение от Max913 Посмотреть сообщение
разве они не должны автоматически искать
А это просто другой селект написать надо, если по всем искать хотите
SQL
1
2
3
4
5
SELECT a.idDish, a.NameOfDish, -- базовое блюдо
b.idDish, b.NameOfDish -- наиболее часто сопутствующее блюдо
FROM Dish a,
Dish b
WHERE b.idDish = frend_dish(a.idDish,'yy', to_date('201501','yyyymm')));
Это вы по всем блюдам за прошлый календарный год
0
0 / 0 / 0
Регистрация: 12.02.2016
Сообщений: 54
12.02.2016, 13:47  [ТС]
ошибка там же

в моих процедурах\запросах он шел от 1 id до последнего и выводил в таблицу, сейчас только ид руками вбивать,чтобы посмотреть результат определенного блюда?
0
765 / 666 / 194
Регистрация: 24.11.2015
Сообщений: 2,163
12.02.2016, 13:56
Цитата Сообщение от Max913 Посмотреть сообщение
ошибка там же
попробуйте запустить селект в новом окне, где вместо pDishId вбейте какое-нибудь id (число)

SELECT idDish FROM (
SELECT idDish, row_number() OVER (ORDER BY cnt DESC) nn
FROM (
SELECT w.idDish, COUNT(*) cnt
FROM Zakaz z,
WhatToZakaz w,
WhatToZakaz b
WHERE w.idZakaz = z.idZakaz
AND b.idZakaz = z.idZakaz
AND w.idDish <> pDishId
AND b.iddish = pDishId
AND trunc(z.date1, 'ww') = trunc(sysdate, 'ww')
GROUP BY w.idDish
)) WHERE nn=1;

Пришлите полностью весь текст ошибки

Добавлено через 1 минуту
У меня аналогичный селект по моим заказам и детализации заказов сработал
0
0 / 0 / 0
Регистрация: 12.02.2016
Сообщений: 54
12.02.2016, 13:59  [ТС]
вывел ид блюда, по базе проверил, все верно, ошибки нет
0
765 / 666 / 194
Регистрация: 24.11.2015
Сообщений: 2,163
12.02.2016, 14:06
Цитата Сообщение от Max913 Посмотреть сообщение
вывел ид блюда,
Вот зараза.
Попробуйте исправить строку в тексте функции. Должна редиска заработать
AND trunc(z.date1, ''''||fmt||'''') = trunc(pBaseDate, ''''||fmt||'''')

и вместо строки, где count, лучше написать

SELECT w.idDish, SUM(w.numberr) cnt

а то у вас количество блюд в заказе не учитывается.

И я вам вопос писал. Если в заказе 5 борщей и одни котлеты, и мы ищем сопутствующее блюдо для борща, то каков "вес" котлет в данном заказе 1 или 0.2 ?
0
0 / 0 / 0
Регистрация: 12.02.2016
Сообщений: 54
12.02.2016, 14:12  [ТС]
у нас с 5 борщами выбрали только котлеты, значит 1
Oracle 11 SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
CREATE OR REPLACE FUNCTION frend_dish(pDishId  IN  NUMBER, 
                                      fmt IN VARCHAR2, 
                                      pBaseDate IN DATE DEFAULT TRUNC(SYSDATE))
-- Входные параметры:    pDishId - код тестируемого блюда
--                       fmt     - маска: 'ww' - неделя с начала года, 'mm' - месяц, 'q' -квартал, 'yy' - календарный год
--                      pBaseDate- базовая дата, для определения недели, месяца и т.д. Если не вводится - берется текущая дата
-- Выходное значение:   (number) - код наиболее часто заказываемого блюда из того же заказа, кроме тестируемого
RETURN NUMBER
IS 
    vDishId      NUMBER;
BEGIN     
    SELECT idDish INTO vDishId FROM (
    SELECT idDish, ROW_NUMBER() OVER (ORDER BY cnt DESC) nn
    FROM (
    SELECT w.idDish, SUM(w.numberr) cnt -- как вариант, можно COUNT(distinct z.idZakaz) - выбор варианта зависит от возможности повторения блюд в заказе
    FROM Zakaz z,
         WhatToZakaz w,
         WhatToZakaz b
    WHERE w.idZakaz = z.idZakaz
      AND b.idZakaz = z.idZakaz
      AND w.idDish <> pDishId
      AND b.iddish =  pDishId
     AND TRUNC(z.date_so_imp, ''''||fmt||'''') = TRUNC(pBaseDate, ''''||fmt||'''')
    GROUP BY w.idDish
    )) WHERE nn=1;
    RETURN vDishId;
EXCEPTION
    WHEN OTHERS THEN
    RETURN NULL;    
END;
Error at line 12: PL/SQL: SQL Statement ignored

он дальше SELECT idDish INTO vDishId FROM ( строчки ничего не видит
0
765 / 666 / 194
Регистрация: 24.11.2015
Сообщений: 2,163
12.02.2016, 14:17
Ну это уже за гранью добра и зла.
Попробуйте убрать все комментарии, вдруг он длинный комментарий как-то неправильно видит
Oracle 11 SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
CREATE OR REPLACE FUNCTION frend_dish(pDishId IN NUMBER,
fmt IN VARCHAR2,
pBaseDate IN DATE DEFAULT TRUNC(SYSDATE))
RETURN NUMBER
IS
vDishId NUMBER;
BEGIN
SELECT idDish INTO vDishId FROM (
SELECT idDish, ROW_NUMBER() OVER (ORDER BY cnt DESC) nn
FROM (
SELECT w.idDish, SUM(w.numberr) cnt
FROM Zakaz z,
WhatToZakaz w,
WhatToZakaz b
WHERE w.idZakaz = z.idZakaz
AND b.idZakaz = z.idZakaz
AND w.idDish <> pDishId
AND b.iddish = pDishId
AND TRUNC(z.date_so_imp, ''''||fmt||'''') = TRUNC(pBaseDate, ''''||fmt||'''')
GROUP BY w.idDish
)) WHERE nn=1;
RETURN vDishId;
EXCEPTION
WHEN OTHERS THEN
RETURN NULL;
END;
0
0 / 0 / 0
Регистрация: 12.02.2016
Сообщений: 54
12.02.2016, 14:21  [ТС]
Error at line 8: PL/SQL: SQL Statement ignored
и эта строка
SELECT idDish INTO vDishId FROM (


а таблицу dish объявлять не нужно?
0
765 / 666 / 194
Регистрация: 24.11.2015
Сообщений: 2,163
12.02.2016, 14:22
Цитата Сообщение от Max913 Посмотреть сообщение
у нас с 5 борщами выбрали только котлеты, значит 1
Да, но к каждому борщу получилось в среднем 0.2 котлеты, поэтому, как бы, из пяти заказов с борщами котлеты встретились только 1 раз, а другие четыре раза выбирали что-то другое. Ну подумайте еще, вдруг придете к другому выводу. Главное, чтобы заработало
0
0 / 0 / 0
Регистрация: 12.02.2016
Сообщений: 54
12.02.2016, 14:27  [ТС]
мы же идем по всем борщам в заказах, если в 5 заказах выбирают котлеты только, то в каждом заказе каждому борщу равна 1 котлета
схему базы прикрепил,может чем поможет

могу с борщами и котлетами ошибаться в мыслях, только первый год знаком с базами
Миниатюры
Перевести из ms sql server  в oracle  
0
765 / 666 / 194
Регистрация: 24.11.2015
Сообщений: 2,163
12.02.2016, 14:30
Цитата Сообщение от Max913 Посмотреть сообщение
а таблицу dish объявлять не нужно?
Селект из поста 28 сработал? Значит ничего не надо менять. Я же его в функции просто повторяю с переменными.
А никакого номера ошибки не выдает?
0
0 / 0 / 0
Регистрация: 12.02.2016
Сообщений: 54
12.02.2016, 14:32  [ТС]
Вот скрин
Миниатюры
Перевести из ms sql server  в oracle  
0
765 / 666 / 194
Регистрация: 24.11.2015
Сообщений: 2,163
12.02.2016, 14:37
Цитата Сообщение от Max913 Посмотреть сообщение
мы же идем по всем борщам в заказах
Понимаете, я не знаю, какую Вам дали постановку, или Вы сами себе постановку придумали. Но я частоту сопутствия ситал бы так. Вычислил, сколько всего заказали борщей за какой-то период. Ну допустим 1000. Вычислил, сколько в заказах с хотя бы одним борщом за тот же период заказали котлет. Допустим 600. Тогда частота сопутствия будет 0.6
Для заказа, где 5 борщей и одни котлеты частота сопутствия 0.2 . А если в заказе 5 борщей и 5 котлет, то частота сопутствия 1. И искал бы я как раз максимум частоты сопутствия, а не просто суммарное количество в заказах.
0
0 / 0 / 0
Регистрация: 12.02.2016
Сообщений: 54
12.02.2016, 14:43  [ТС]
понял вас, тогда ваша мысль правильная
0
765 / 666 / 194
Регистрация: 24.11.2015
Сообщений: 2,163
12.02.2016, 14:44
Ну попробуем еще один вариант с неявным курсором
Oracle 11 SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
CREATE OR REPLACE FUNCTION frend_dish(pDishId IN NUMBER,
fmt IN VARCHAR2,
pBaseDate IN DATE DEFAULT TRUNC(SYSDATE))
RETURN NUMBER
IS
vDishId NUMBER := NULL;
BEGIN
FOR vv IN (
SELECT idDish FROM (
SELECT idDish, ROW_NUMBER() OVER (ORDER BY cnt DESC) nn
FROM (
SELECT w.idDish, SUM(w.numberr) cnt
FROM Zakaz z,
WhatToZakaz w,
WhatToZakaz b
WHERE w.idZakaz = z.idZakaz
AND b.idZakaz = z.idZakaz
AND w.idDish <> pDishId
AND b.iddish = pDishId
AND TRUNC(z.date1, ''''||fmt||'''') = TRUNC(pBaseDate, ''''||fmt||'''')
GROUP BY w.idDish
)) WHERE nn=1)
LOOP
vDishId:=vv.idDish;
END LOOP;
RETURN vDishId;
END;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.02.2016, 14:44
Помогаю со студенческими работами здесь

Импорт данных из Oracle в SQL Server
Из одной таблицы в оракловой БД нужно скопировать данные в таблицу MS SQL средствами c# VS08. Делаю так: string connectionString1 =...

2-е одинаковые базы в SQL Server и Oracle
Здравствуйте. Кто знает, помогите, пожалуйста. У меня на работе есть 2-е программы (Для удобства буду называть их П1 и П2), написанные...

Переучиться с Oracle на Microsoft SQL Server
Насколько это сложно? Сколько времени это может занять? Заранее спасибо.

Сравнение SQL Server 2005 и Oracle 10g
Итак, нужно провести сравнительную характеристику SQL Server 2005 и Oracle 10g. Нужно сравнить по основным параметрам, типа: аппаратные...

Oracle: MySQL будет конкурировать с Microsoft SQL Server
Корпорация Oracle сегодня рассказала о своих дальнейших планах в отношении открытой СУБД MySQL, владельцем которой она стала при покупке...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Модель здравосохранения 14. Собираем всю модель вместе.
anaschu 22.05.2026
Модель собрана. В будущих постах на видео я покажу, как она работает. В этом посте запускаем её, проверяем результаты и разбираем что можно с ней делать дальше. Перед запуском проверяем. . .
Модель здравоохранения 13. Добавление самой системы здравоохранения.
anaschu 22.05.2026
В предыдущем посте мы настроили болезни. Теперь добавим события, которые управляют здоровьем всего коллектива, а также настроим рабочий график и расчёт финансов. В Main создаём четыре события. . . .
Модель здравоохранения 12. добавление болезней через ресурпул, как аварии
anaschu 22.05.2026
Болезни — это ключевая часть нашей модели. Нам нужно, чтобы работник периодически уходил на больничный, его задание при этом зависало, а после выздоровления работа возобновлялась. Реализуем это двумя. . .
Модель здравоохранения 11. Создаём классы Задание и Работник
anaschu 22.05.2026
В AnyLogic каждая заявка и каждый ресурс — это объект определённого класса. Нам нужно создать два класса: Задание (заявка) и Работник (ресурс). Класс Задание В дереве проекта нажимаем правой. . .
Модель здравоохранения 10. Новая модель, смотрим, как добавлять логические блоки, и что писать внутри
anaschu 22.05.2026
Открываем AnyLogic, создаём новый проект. В дереве проекта появляется класс Main — это главный агент, в котором будет жить вся наша логика. Палитра блоков Слева находится палитра. Нас интересует. . .
модель ЗдравоСохранения 9. Новая модель, разбираемся, как ее создавать
anaschu 22.05.2026
В этой серии постов мы построим модель небольшого рабочего коллектива. Сотрудники получают задания, выполняют их, иногда болеют — и мы хотим посчитать, сколько это стоит компании. Метод. . .
[golang] Linked list
alhaos 22.05.2026
Связный список / Linked list Связный список структура данных позволяющая хранить список значений, в отличии от массива в памяти хранится не сплошным куском, а отдельными частями которые ссылаются. . .
[golang] Двоичная куча, min-heap
alhaos 20.05.2026
Двоичная куча Двоичная куча — структура данных, которая всегда держит самый важный элемент наготове. Представьте очередь к хилеру в игре, и очередь из игроков в приоритете те у кого меньше. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru