Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Оператор Merge. Объединить только первые 100 записей

Добрый день. Подскажите пожалуйста, возможно ли в операторе Merge ограничить проход? Допустим, мне нужно объединить только первые 100 записей, а остальные не трогать.
Ответ: Ну наконец удалось авторизоваться. Целый день пытался войти, и все никак.
Gepar, сам пример по теме я написал быстро, как уже говорил, а потом стал экспериментировать. Нарвался на ошибку и решил сделать более наглядный пример. Чем сегодня и занимался.
В первом скрипте я создаю последовательность и две таблицы: одну с триггером, другую - без.
Кликните здесь для просмотра всего текста
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
31
32
33
34
35
36
37
-- drop table test_tab;
-- drop table test_tab1;
 
CREATE SEQUENCE test_seq
  INCREMENT BY 1
  START WITH 1
  MINVALUE 1
  MAXVALUE 9999999999999999999999999999
  NOCYCLE
  ORDER
  NOCACHE
;
 
CREATE TABLE test_tab
   (seq                            NUMBER,
    val                            NUMBER)
;
 
CREATE OR REPLACE TRIGGER test_tab_tbi
 BEFORE
  INSERT
 ON test_tab
REFERENCING NEW AS NEW OLD AS OLD
 FOR EACH ROW
BEGIN
    IF :NEW.seq IS NULL THEN
        :NEW.seq := test_seq.NEXTVAL;
    END IF;
END;
 
CREATE TABLE test_tab1
   (seq                            NUMBER,
    val                            NUMBER)
;
 
-- truncate table test_tab1;
-- truncate table test_tab;

Во второй скрипт входят два MERGE и селекты для просмотра. Выполняется первый MERGE, потом второй MERGE, потом смотрим результат
Кликните здесь для просмотра всего текста
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
31
32
33
34
35
36
37
MERGE INTO test_tab ps_out
USING (SELECT * FROM (
       SELECT seq, val,
              ROW_NUMBER() OVER (ORDER BY seq, val) nn
       FROM test_tab1
       UNION
       SELECT NULL, NULL, 0 FROM dual
       ) WHERE nn <= 100
      ) ps_in
ON (ps_out.seq = -ps_in.seq )
WHEN MATCHED THEN
    UPDATE SET ps_out.val=Round( DBMS_RANDOM.VALUE(low => -10 , high => 10))
WHEN NOT MATCHED THEN
    INSERT (val)
    VALUES (Round( DBMS_RANDOM.VALUE(low => -10 , high => 10)))
    ;
 
MERGE INTO test_tab1 ps_out
USING (SELECT * FROM (
       SELECT seq, val,
              ROW_NUMBER() OVER (ORDER BY seq, val) nn
       FROM test_tab
       ) WHERE nn <= 100
       ) ps_in
ON  (ps_out.val= ps_in.val) 
WHEN MATCHED THEN
    UPDATE SET ps_out.seq=-ps_out.seq
WHEN NOT MATCHED THEN
    INSERT (seq, val)
    VALUES (ps_in.seq, Round( DBMS_RANDOM.VALUE(low => -10 , high => 10)))
    ;
 
SELECT a.seq, a.val
  FROM test_tab a;
  
SELECT a.seq, a.val
  FROM test_tab1 a;  

Рано или поздно на одном из мерждей возникает ошибка ORA-30926: unable to get a stable set of rows in the source tables. Я примерно представляю ситуацию так, что она возникает, когда в каком-то из апдейтов на одно условие приходится больше одной записи. А может и не совсем правильно уловил момент возникновения ошибки. Сперва у меня было не 100, а 10. И в одной из выборок у меня ошибка все никак не возникала. Я решил, что играет слишком мало записей и увеличил условие ограничения до 100.
Что меня беспокоит. Написаны некие операторы, которые работают-работают, и вдруг падают по ошибке. То есть , я начал писать пример для ограничения, а набрел на некую ошибку, причем в описании MERGE я не заметил никаких рекомендаций по поводу того, как эту ошибку следует избегать, И вообще, никаких предупреждений о том, что такая ошибка может возникнуть. Любопытно, что получится у Вас
Вопрос: Без явного приведения типов не подхватывается оператор

Есть PostgreSQL 9.5. Есть объявление таблицы, в котором типы для всех столбцов организованы через домены:

CREATE DOMAIN d_organization_id AS NUMERIC;
CREATE DOMAIN d_common_date AS DATE;
CREATE DOMAIN d_date_range AS DateRange;

create sequence seq_organizations_id;

create table Organizations
(
   org_id               d_organization_id    not null DEFAULT nextval('seq_organizations_id'),
   org_active_period    d_date_range         DEFAULT daterange(NULL,NULL),
   org_valid_from       d_common_date,
   constraint CHT_Valid_date_in_period
      check ( org_valid_from::date <@ org_active_period::daterange )
)


Проверка на вхождение даты в диапазон работает, если явно приводить типы данных к базовому типу домена:
check ( org_valid_from::date <@ org_active_period::daterange )

А без приведения типа
check ( org_valid_from <@ org_active_period )
выдаётся ошибка:
operator does not exist: <@ HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts.

Хотя документация гласит:
Глава 10.2 в переводе PostgresPro
Если один из аргументов имеет тип домен, далее считать его типом базовый тип домена. Благодаря этому при поиске неоднозначно заданного оператора домены будут подобны свои базовым типам.

Почему же не работает без явного преобразования?
Ответ: Maxim Boguk,

там в

If any input argument is of a domain type, treat it as being of the domain's base type for all subsequent steps. This ensures that domains act like their base types for purposes of ambiguous-operator resolution.


т.е. по идее не один из, а любой из. я так понял нам этот оператор нужен и других подходящих нет:
\do <@
                                                 List of operators
   Schema   | Name | Left arg type | Right arg type | Result type |                   Description
------------+------+---------------+----------------+-------------+-------------------------------------------------
 pg_catalog | <@   | anyarray      | anyarray       | boolean     | is contained by
 pg_catalog | <@   | anyelement    | anyrange       | boolean     | is contained by
 pg_catalog | <@   | anyrange      | anyrange       | boolean     | is contained by
 pg_catalog | <@   | box           | box            | boolean     | is contained by
 pg_catalog | <@   | circle        | circle         | boolean     | is contained by
 pg_catalog | <@   | jsonb         | jsonb          | boolean     | is contained by
 pg_catalog | <@   | lseg          | box            | boolean     | is contained by
 pg_catalog | <@   | lseg          | line           | boolean     | lseg on line
 pg_catalog | <@   | point         | box            | boolean     | point inside box
 pg_catalog | <@   | point         | circle         | boolean     | is contained by
 pg_catalog | <@   | point         | line           | boolean     | point on line
 pg_catalog | <@   | point         | lseg           | boolean     | is contained by
 pg_catalog | <@   | point         | path           | boolean     | point within closed path, or point on open path
 pg_catalog | <@   | point         | polygon        | boolean     | is contained by
 pg_catalog | <@   | polygon       | polygon        | boolean     | is contained by
 pg_catalog | <@   | tsquery       | tsquery        | boolean     | is contained by
 public     | <@   | hstore        | hstore         | boolean     |
 public     | <@   | integer[]     | integer[]      | boolean     | contained in
(18 rows)


причем если только первый аргумент привести к date - то работает, а если только второй к daterange то нет. я думаю стоит в -bugs написать.
Вопрос: Oracle BI GoURL between оператор в Navigation Parameters

Всем, HI!

Пытаюсь сделать параметр по дате с оператором between - не получается.

URL формируется такой:
[url=] saw.dll?Go&Path=/Shared/Test/SB2 &Action=Navigate&P0=1&P1=bet&P2=COLUMN.DAT&P3=2+02.07.2017+03.07.2017 [/url]

Подскажите, что ни так делаю?
Ответ: О чудо!!!! Я подобрал необходимую комбинацию!
Строка параметров должна быть такой:
... &Action=Navigate&P0=1&P1=bet&P2="FIELD".DATE&P3=2+"01.07.2017"+"02.07.2017"


Анализ должен содержать фильтр по той же колонке с таким же оператором.
Вопрос: Оператор PIVOT

Приветствую вас, Друзья

Прошу вас помочь с решением данной задачи, пытался сам, но далее SELECT не зашел)

Создайте запрос, который возвращает табличное значение из таблицы Production.Product.
--Используйте оператор PIVOT.
--Результирующая таблица должна иметь поля с именами Name, RED, BLUE и BLACK и содержать значения полей
--SafetyStockLevel, Color, Name из таблицы Production.Product.
--Результирующий набор должен включать только те записи из таблицы Production.Product, для которых поле
--Name содержит строку 'Helmet'.
--Просуммируйте значения в поле SafetyStockLevel по цветам Red, Blue and Black.
--Отсортируйте результирующий набор по полю Name.
Ответ: dermama,

задача не имеет решения, т.к. в mysql оператора pivot нет.
Вопрос: Помогите с Iif и операторы сравнения >0

Здравствуйте! Я вроде не лентяй и погуглил и полопатил форум прежде чем задать свой чайниковский вопрос. Проблема какая-то дурацкая - не могу понять почему не работает Iif с оператором сравнения внутри >10000. Вот пример и база во вложении
SELECT tbl_source.DATE_RCV, tbl_source.SUMPRICE
FROM tbl_maindata INNER JOIN tbl_source ON tbl_maindata.IDOWNER = tbl_source.IDSELLER
WHERE (((tbl_source.SUMPRICE)=IIf([tbl_maindata].[STAT]=Yes,[tbl_source].[SUMPRICE]>10000)));

Запрос работает, но зараза не дает результат! Если просто поставить условие >10000, то всё нормуль! Как так? Я из найденного смог только попробовать вставить SELECT внутрь Iif и тоже не помогло

К сообщению приложен файл (tmp.zip - 107Kb)
Ответ: Блин справился. Башкой надо было чуть чуть поработать - всего лишь сам оператор вынести за условие Iif
SELECT tbl_source.DATE_RCV, tbl_source.SUMPRICE
FROM tbl_maindata INNER JOIN tbl_source ON tbl_maindata.IDOWNER = tbl_source.IDSELLER
WHERE (((tbl_source.SUMPRICE)>IIf([tbl_maindata].[STAT]=Yes,-1,0)));
Вопрос: Сгруппировать записи по оператору и узнать количество в каждой группе

Добрый день. Прошу немного вашей мудрости))) Просто столкнулся с такой проблемой есть таблица со структурой ID,фамилия, Имя, Отчество, оператор, Нужно сгруппировать всех по оператору и узнать количество каждой группировки, например оператор Смирнов количество 200 и тд.

select OPERATOR
from zayav
group by OPERATOR
ORDER by OPERATOR


P.s. Извиняюсь если данная тема поднималась а я ее снова начинаю поднимать.
Ответ:
Код SQL
1
2
3
4
SELECT OPERATOR, COUNT(ID) AS Col_vo
FROM zayav
GROUP BY OPERATOR
ORDER BY OPERATOR
Вопрос: Оператор With в функции

Написал функцию такого вида
CREATE OR REPLACE FUNCTION get_all_foo() RETURNS table foo(.......) AS
$BODY$
BEGIN
    with t as (....),
    t1 as (....),
    t2 as (....),
    t3 as (....) --непонятно что здесь хочет еще один оператор
select 1; --без этого оператора не хочет работать
return query select * from t3;
END
$BODY$
LANGUAGE plpgsql;

Никак не хочет возвращать результат хотя все что внутри тела функции без нее мне выдает результат. Типы в " RETURNS table foo(.......)" соответствуют возвращаемой таблице. Что я делаю не так с этим оператором WITH?
Ответ: Как вы написали так более логично и скорей всего правильно, спасибо. Логику понял.
Функция потому в ней не только этот один запрос, а еще добавится несколько и еще пару условий и один цикл :)
Вопрос: Использование операторов сравнения с операторами SOME/ANY

Выведите все данные (*) о тех сотрудниках, зарплаты которых больше, чем средняя зарплата в хотя бы одном из отделов.
Указание: Использование операторов сравнения с операторами SOME/ANY.
SQL
1
2
3
SELECT *
FROM employees
WHERE salary > SOME(SELECT avg(e.salary) FROM employees e)
Проверяющая система показывает ошибку, мол, таких сотрудников больше, чем то количество, которое показывает мой запрос
Ответ: Nike1995, а так?
SQL
1
SELECT * FROM employees q WHERE q.salary > any(SELECT avg(w.salary) FROM employees w GROUP BY w.departmentid)
Вопрос: Замена операторов!?

Здравствуйте. Мне необходимо заменить оператор команду с show на команду select, которая возвращала те же самые данные.
Приведу пример:
show status like '%onn%';
-- показывает статус активных подключений

Какой аналог данной команды через select?
Так же я думал над тем, что для команды select необходима таблица, но её нет?
А если её нет, можно ли создать таблицу с данными используя команду show (ведь мы можем с помощью оператора select создать таблицу на основе содержимого).
Подскажите, может всё таки есть таблица, откуда берет данные команда show?

Но основная задача такая: получить данные о активных подключениях (всю инфу из команды show) с помощью оператора select.

P.S. Такой изврат необходим для мониторинга БД с помощью Zabbix через триггеры Zabbix-а.
Ответ: Создайте хранимую процедуру, в которой выполняйте свой show status. Если надо - передавайте и параметры. Результат команды, как и результат обычного запроса, будет помещён в выходной поток и получен приложением как набор записей.
Вопрос: порядка выполнения операторов (select, from, where, having, group by, top)

Порядка выполнения операторов (select, from, where, having, group by, top)
сервером.
Где-то на форуме есть, найти не могу.

Что сервер делает в первую очередь INNER JOIN или WHERE ? Хочется увидеть порядок для всех операторов MS SQL.
Ответ:
kDnZP
trew, изучайте


Note that the actual physical execution of the statement is determined by the query processor and the order may vary from this list.