сохранить результат выбора в переменной и использовать в условии условия - PullRequest
0 голосов
/ 09 июля 2019

A имеет 3 SQL-запроса, которые я собрал, используя union.Первые 2 запроса возвращают уникальные идентификаторы заказа, но третий запрос повторяет идентификаторы заказа из первых 2. Мне нужно исключить эти результаты в запросе 3.

Пример:

QUERY 1:
SELECT DISTINCT
ORDER_ID,
PRODUCT
FROM
ORDERS
WHEN TYPE=A

пример запроса 1данные {12121212,13131313}

QUERY 2:
SELECT DISTINCT
ORDER_ID,
PRODUCT,
FROM
ORDERS
WHEN CATEGORY=X

Пример данных запроса 2 {14141414,15151515}

QUERY 3:
SELECT DISTINCT
ORDER_ID,
PRODUCT
FROM    
ORDERS
WHEN TYPE=C

Пример данных запроса 3 {17171717,12121212,14141414}

Таким образом, запрос 3 повторяет данные запроса 1 и 2. Реальные данные намного больше.Я пытаюсь использовать результаты первых двух запросов, которые будут исключены из запроса3

query1
union
query2
union
SELECT DISTINCT
ORDER_ID,
PRODUCT
FROM    
ORDERS
WHEN TYPE=C
AND
ORDER_ID NOT IN (Variable1=ORDER_ID IN QUERY1,Variable2=ORDER_ID IN QUERY2)

Желаемые данные {12121212,13131313,14141414,15151515,16161616,17171717}

Как я могу хранить переменные для использования в условии where?

Ценить любую помощь

Ответы [ 2 ]

0 голосов
/ 12 июля 2019

вы можете попробовать это

select * from
 (SELECT DISTINCT
  ORDER_ID,
  PRODUCT
  FROM
  ORDERS
  where TYPE='A') as q1,
 (SELECT DISTINCT
  ORDER_ID,
  PRODUCT
  FROM
  ORDERS
  WHERE CATEGORY='X'
  ) as q2,
 (SELECT DISTINCT
  ORDER_ID,
  PRODUCT
  FROM    
  ORDERS
  where  TYPE='C') as q3
 WHERE q1.order_id=q2.order_id
0 голосов
/ 10 июля 2019

Кажется (но очень трудно догадаться с какой-либо определенностью), что вы, возможно, захотите выполнить иерархический сбор данных, независимо от того, выбраны ли данные из 1-го доступного источника (из списка приоритетов), который имеет их, и следующие источники получатигнорируется.

Лучше всего было бы создать постоянную таблицу, имеющую все это:

ORDER_ID, PRODUCT, Source_Priority

Такая таблица будетотслеживайте последние данные из всех таблиц (например, с помощью триггера AFTER UPADTE OR INSERT OR DELETE на ORDERS и других источниках), и тогда ваш запрос будет переформулирован как "запросить новую таблицу, получить строки с максимальнымORDER_ID-value-of-Source_Priority ", который задавался много раз и решается одним JOIN в Firebird 2 или оконными функциями в Firebird 3.

Если вы не хотите иметь выделенныйТаблица постоянных приоритетов. Вы можете сделать это, используя

  1. Глобальную временную таблицу, чтобы выполнить сортировку https://firebirdsql.org/file/documentation/reference_manuals/fblangref25-en/html/fblangref25-ddl-tbl.html#fblangref25-ddl-tbl-gtt
  2. MERGE, чтобы выполнить условные вставки (очисткатаблица перед ним) https://firebirdsql.org/file/documentation/reference_manuals/fblangref25-en/html/fblangref25-dml-merge.html
  3. SELECT для чтения данных из подготовленного GTT

Если вы хотите сделать вид, что это будет один запрос, а не 2 + N, тогдаВы можете спрятать их внутри

по имени Stored Procedure или анонимный EXECUTE BLOCK https://firebirdsql.org/file/documentation/reference_manuals/fblangref25-en/html/fblangref25-dml-execblock.html

Примерно так:

Create GLOBAL TEMPORARY TABLE TMP_ORDERS
( ORDER_ID integer PRIMARY KEY,
  PRODUCT VarChar(10) );

А затем замените ваш "один истинный запрос" на этотпоследовательность (может быть скрыта внутри блока выполнения, если это необходимо)

DELETE FROM TMP_ORDERS;


INSERT INTO TMP_ORDERS
SELECT DISTINCT
ORDER_ID,
PRODUCT
FROM
ORDERS
WHEN TYPE=A;

MERGE INTO TMP_ORDERS as Dest
USING (
  SELECT DISTINCT
  ORDER_ID,
  PRODUCT,
  FROM
  ORDERS
  WHEN CATEGORY=X
) as Src
WHEN NOT MATCHED THEN
  INSERT(Dest.ORDER_ID, Dest.PRODUCT) VALUES(Src.ORDER_ID, Src.PRODUCT);

MERGE INTO TMP_ORDERS as Dest
USING (
  SELECT DISTINCT
  ORDER_ID,
  PRODUCT,
  FROM
  ORDERS
  WHEN TYPE=C) as Src
WHEN NOT MATCHED THEN
  INSERT(Dest.ORDER_ID, Dest.PRODUCT) VALUES(Src.ORDER_ID, Src.PRODUCT);

SELECT * FROM TMP_ORDERS;

PS, но почему ваши частичные запросы даже содержали DISTINCT?Разве ORDER_ID уже не ваш primary key там, который никогда не может быть неразличимым, для начала?

...