Кажется (но очень трудно догадаться с какой-либо определенностью), что вы, возможно, захотите выполнить иерархический сбор данных, независимо от того, выбраны ли данные из 1-го доступного источника (из списка приоритетов), который имеет их, и следующие источники получатигнорируется.
Лучше всего было бы создать постоянную таблицу, имеющую все это:
ORDER_ID, PRODUCT, Source_Priority
Такая таблица будетотслеживайте последние данные из всех таблиц (например, с помощью триггера AFTER UPADTE OR INSERT OR DELETE
на ORDERS
и других источниках), и тогда ваш запрос будет переформулирован как "запросить новую таблицу, получить строки с максимальнымORDER_ID-value-of-Source_Priority ", который задавался много раз и решается одним JOIN в Firebird 2 или оконными функциями в Firebird 3.
Если вы не хотите иметь выделенныйТаблица постоянных приоритетов. Вы можете сделать это, используя
- Глобальную временную таблицу, чтобы выполнить сортировку https://firebirdsql.org/file/documentation/reference_manuals/fblangref25-en/html/fblangref25-ddl-tbl.html#fblangref25-ddl-tbl-gtt
MERGE
, чтобы выполнить условные вставки (очисткатаблица перед ним) https://firebirdsql.org/file/documentation/reference_manuals/fblangref25-en/html/fblangref25-dml-merge.html 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
там, который никогда не может быть неразличимым, для начала?