Oracle SQL

Фильтр по тегу: select


WITH в ORACLESQL

Оператор WITH позволяет заранее формировать внутренний подзапрос , позволяет обращаться к данному подзапросу по синониму в основном запросе.
Синтаксис
WITH 
T1 as (SELECT field_list FROM T list join WHERE cond group by ...) , 
T2 as (SELECT field_list FROM T list join WHERE cond2 group by ..) , tn as ....
SELECT * FROM T1, T2 where t1.cond= t2.cond

и для того чтобы было совсем понятно - пара примеров :)

WITH T AS (SELECT * FROM ALL_OBJECTS) , T2 AS 
(SELECT * FROM ALL_tables A , T WHERE T.OBJECT_NAME = A.TABLE_NAME ) 
SELECT TABLE_NAME FROM T2 
 
-- сложное обращение 

WITH T AS (SELECT * FROM ALL_OBJECTS) , 
T2 AS (SELECT * FROM ALL_tables) 
SELECT * FROM T, T2 WHERE T.OBJECT_NAME = T2.TABLE_NAME;
 
-- последовательно используем t1,t2

>Splash
>А если перед основным запросом два из WITH, притом что у второго используется первый, а потом они все вместе идут в основной?
with 
t1 as (select object_type, created lstcrdt  , object_name from all_objects),
t2 as (select object_type, count(object_name) cnttype from t1 group by object_type)
select * from t1 inner join t2 on t1.object_type = t2.object_type
добавлено: 21 ноя 17 просмотры: 586, комментарии: 1



Oracle 12c и JSON немножечко...

немного про JSON и ORACLE 12
create table info_user_v (
  id number primary key -- иднтификатор уникальный
, name varchar2(50) -- наименование 
, json_data varchar2(4000) -- данные JSON 
);


в oracle 12 есть специальное ограничение, чтобы добавлять в поле только данные json формата, и чтобы исключить ошибки со структурой JSON
добавим его к нашей таблице
alter table info_user_v add constraint c_1_json_data check(json_data is json);


читать дальше...
добавлено: 05 окт 17 просмотры: 1195, комментарии: 0



MODEL. SQL высший пилотаж. Часть 2. Сложные последовательности.

Авторский курс. SQL от новичка до профессионала. Бесплатное вводное занятие. Сертификат. Записывайся!
Прокачаю до уровня БОГ!


Используем Model для создания массивов
-- создание одномерного массива
SELECT *
FROM dual
    MODEL DIMENSION BY (0 as т1)
    MEASURES (cast(dummy as varchar2(20)) as ct) 
    RULES (        
        ct[0] = '1',
        ct[1] = '2',       
        ct[1] = '3',
        ct[2] = '4',
        ct[3] = '5'
    ) order by 1;
--Т1	CT
--0	1
--1	3
--2	4
--3	5


читать дальше...
добавлено: 03 июл 15 просмотры: 3319, комментарии: 0



Конструкция MERGE, вставка - обновление

Авторский курс. SQL от новичка до профессионала. Бесплатное вводное занятие. Сертификат. Записывайся!
Прокачаю до уровня БОГ!


Назначение
Позволяет дополнять и обновлять данные одной таблицы - данными другой таблицы. При слиянии таблиц проверяется условие, и если оно истинно, то выполняется Update, а если нет - Insert. Причем нельзя изменять поля таблицы в секции Update, по которым идет связывание двух таблиц.

Является командой DML!

Синтаксис
MERGE INTO TABLE_NAME 
USING table_reference ON (condition) WHEN MATCHED 
THEN UPDATE SET column1 = value1 [, column2 = value2 ...] WHEN NOT MATCHED 
THEN INSERT (column1 [, column2 ...]) VALUES (value1 [, value2 ...) ;

читать дальше...
добавлено: 17 апр 15 просмотры: 35847, комментарии: 0



Аналитический SQL Oracle за 20 минут

Аналитический SQL демонстрирует исключительную производительность, запросы с использованием Аналитического SQL потребляют меньше ресурсов и выполняются быстрее.
Авторский курс. SQL от новичка до профессионала. Бесплатное вводное занятие. Сертификат. Записывайся!
Прокачаю до уровня БОГ!

изучаем SQL группа в контакте - присоединяйтесь

Применяется в основном для отчетности , для следующих типов задач
1. Запросы рейтингов, первых N
2. Запросы с накопительным итогом
3. Запросы с конструкцией окна
4. Может применятся и для оптимизации запросов

Какие бывают функции в аналитическом, разберём основные
ROW_NUMBER() – номер строки в группе
LAG(f, n,m) –f имя поля, n предыдущее значение в группе, m – знач по умолчанию
LEAD(f, n,m) -f имя поля, n последующее значение в группе, m – знач по умолчанию
FIRST_VALUE(f) – f имя поля, первое значение в группе ,
LAST_VALUE(f) –f имя поля, последнее значение в группе
STD_DEV(f) – f имя поля, значение стандартного распределения в группе
SUM(f) – f имя поля, накопительная сумма по группе
AVG (f)– f имя поля, среднее по группе заданной групп
RANK(f) – f имя поля, относительный ранг записи в группе


Синтаксис
SELECT аналитическая функция OVER([PARTITION партицирование…] 
ORDER BY (упорядочивание выражение 2 [,…] [{ASC/DESC}] [{NULLS FIRST/NULLS LAST}]) а


читать дальше...
добавлено: 15 апр 15 просмотры: 47243, комментарии: 0



INSERT ALL - Множественная вставка

Авторский курс. SQL от новичка до профессионала. Бесплатное вводное занятие. Сертификат. Записывайся!
Прокачаю до уровня БОГ!


Как было бы хорошо с помощью одной команды Insert добавлять много записей сразу в разные таблицы :)
И такая возможность существует. Для этого используется команда INSERT ALL


INSERT ALL  Синтаксис
INSERT ALL INTO <table_name1> VALUES <value_list)
INTO <table_name2> VALUES <value_list>)
...<SELECT Statement>;
Где table_name1, table_name1 таблицы ,  
...<SELECT Statement> - запрос  для вставки данных

Приведем пример
Создадим две таблицы tab1,tab2
create table tab1(id number , val number);

create table tab2(id number , val number);



Используя инструкцию INSERT ALL INTO добавим данные в эти таблицы

insert into tab2 values(9000,9000);
commit;
insert all 
into tab2(id,val) values(1001,1112)
into tab1(id,val) select id,val from tab2 ;
commit;


Второй вариант вставки

insert all 
into tab2(id,val) values(1001,1112)
into tab1(id,val) select id,val from tab2 ;


Дополнительный интерес представляет конструкция insert all с условным выражением приведем пример использования

INSERT ALL WHEN id1 <> 11 THEN INTO tab2
values
  (id1, val1)
  select id as id1, val as val1 from tab1;
добавлено: 09 апр 15 просмотры: 5715, комментарии: 2



Множественный UPDATE

Чалышев М.М www.orasource.ru
мое резюме рассмотрю предложения...

изучаем SQL группа в контакте - присоединяйтесь


Итак, небольшая заметка по операторы UPDATE
предположим что нам необходимо заменить значения в таблице 1 , данными из таблицы 2
можно конечно написать что то вроде
update t1 set t1.f1=select t2.f1 from t2 where t2.key1 = t1.key

но у нас есть более легкий способ произвести подобную операцию
UPDATE
(
SELECT
       t.c1,
       t.c2,
       s.c1 AS c1_new,
       s.c2 AS c2_new
 
FROM table1 t
INNER JOIN table2 s ON s.key=t.key
)
tt
SET tt.c1=tt.c1_new, tt.c2=tt.c2_new


Где table1, table2 это
То есть на основании данных из одной таблицы мы обновляем данные в другой таблице, важно наличие первичного ключа в каждой из представленных таблиц
приведем пример демонстрирующий работу UPDATE с несколькими таблицами

create table PHONES1
(
  PHONENUM VARCHAR2(48) not null primary key,
  NAME VARCHAR2(48)
);

create table PHONES
(
  PHONENUM VARCHAR2(48) not null primary key,
  NAME VARCHAR2(48)
);


заполним данными и выполним UPDATE
INSERT INTO PHONES1(PHONENUM, name) values ('495 1211133','Алексеев1');
INSERT INTO PHONES1(PHONENUM, name) values ('499 3311133','Михайлов1');
INSERT INTO PHONES1(PHONENUM, name) values ('917 12122sd3','Коробочкин1');
INSERT INTO PHONES1(PHONENUM, name) values ('499 33111133','Костин1');

INSERT INTO PHONES(PHONENUM, name) values ('495 1211133','Алексеев');
INSERT INTO PHONES(PHONENUM, name) values ('499 3311133','Михайлов');
INSERT INTO PHONES(PHONENUM, name) values ('917 12122sd3','Коробочкин');
INSERT INTO PHONES(PHONENUM, name) values ('499 33111133','Костин');
INSERT INTO PHONES(phonenum, name) values ('214 331das1133','Докучаев');

UPDATE (SELECT   t.phonenum AS phonenum1,       t.phonenum phonenum2,        s.name AS name1, t.name AS name_new FROM phones1 t
INNER JOIN phones s ON s.phonenum=t.phonenum )  Tt SET tt.name1=tt.name_new

результат - обновление данных в phones из таблицы phones1
добавлено: 08 апр 15 просмотры: 3053, комментарии: 3



Задача с валютами

Чалышев М.М www.orasource.ru ; резюме автора

Исходные данные
-- есть таблица в с номером валюты, датой заполнения курса, курсом валюты
-- оператор вводит курс валюты, когда он поменялся , то есть если несколько дней подряд одинаковый курс - то, в таблице будет единственное значение курса на дату изменения
-- необходимо вывести курс валюты на заданную дату , по каждой валюте
-- если на данную дату нет курса тогда выводится курс на последнюю дату, если в заданную дату курс менялся несколько раз , то надо вывести все изменения
-- Подготовим данные для примера
-- создадим таблицу с валютами
create table cratio as
(
  select 
    trunc(sysdate-dbms_random.value*10) ddate -- случайная дата отдаленная от текущего числа на случайное количество дней
  , trunc(dbms_random.value*3+1)  currency -- случайный номер валюты - идентификатор от 1 до 3
  , trunc(dbms_random.value*10) ratio  -- курс валюты от 1 до 10
     from dual
  connect by level <= 30)

читать дальше...
добавлено: 19 ноя 12 просмотры: 3002, комментарии: 7