Oracle SQL: встроенная таблица в инструкции SELECT? - PullRequest
0 голосов
/ 14 января 2020

Я настраиваю инструмент интеграции, который перемещает данные из Системы A в Систему B. Я предоставляю оператор SQL SELECT, который выполняется в Системе A, и выходные данные оператора определяют, что в Системе B обновляется. Например, чтобы обновить показатель международных продаж Team 1:

SELECT
  'Team1_Int_Sales_Count' Code,
  count(*) Count,
  to_char(<integration tool date syntax>) Period
FROM
  Sales
JOIN
  ADozenMoreTables ON stuff
WHERE
  ADozenOpaqueFields IN ADozenOpaqueReferences
  AND Sales.Date BETWEEN <integration tool date syntax>
  AND Team = 'Team1'
  AND Sales.Type = 'International'

Он использует возвращенные поля Code, Value и Period, чтобы обновить этот код для этого периода с этим значением. (Поля, идентифицированные в каком порядке, а не по имени.)

Затем, для продажи в команде 1 c, я скопировал и вставил весь запрос, изменил код и один WHERE предложение:

SELECT
  'Team1_Dom_Sales_Count' Code,
  <otherwise as above>
  AND Sales.Type = 'Domestic'

А затем я копирую и вставляю его еще четыре раза для команд 2 и 3

SELECT
  'Team2_Int_Sales_Count' Code,
  <snip>
  AND Team = 'Team2'
  AND Sales.Type = 'International'

SELECT
  'Team2_Dom_Sales_Count' Code,
  <snip>
  AND Team = 'Team2'
  AND Sales.Type = 'Domestic'

SELECT
  'Team3_Int_Sales_Count' Code,
  <snip>
  AND Team = 'Team3'
  AND Sales.Type = 'International'

SELECT
  'Team3_Dom_Sales_Count' Code,
  <snip>
  AND Team = 'Team3'
  AND Sales.Type = 'Domestic'

В полной задаче есть оператор из ~ 60 строк SELECT с перестановками 3x3x3 и количеством копий / вставок вызывает у меня страх.

Есть ли какой-то способ, которым я могу написать одно SQL SELECT заявление, которое будет проходить через все перестановки без копирования- вставил повторение? На мой взгляд, у меня были бы перестановки во временной таблице, созданной в виде строки или в виде двумерного массива, и запрос мог бы вернуть код и значение, где совпадают два других поля:

      { {'Team1_Int_Sales_Count', 'Team1', 'International'},
        {'Team1_Dom_Sales_Count', 'Team1', 'Domestic'},
        {'Team2_Int_Sales_Count', 'Team2', 'International'},
        {'Team2_Dom_Sales_Count', 'Team2', 'Domestic'},
        {'Team3_Int_Sales_Count', 'Team3', 'International'},
        {'Team3_Dom_Sales_Count', 'Team3', 'Domestic'} } Permutations

Ограничения здесь - это инструмент интеграции, требующий, чтобы я поставлял каждую задачу одним оператором SELECT. Я не могу предварять его оператором WITH, или объявлять функции, или сохранять сложный запрос как представление в исходной базе данных, или делать что-нибудь забавное или приятное. И это Oracle ODB C соединение, поэтому оно использует Oracle SQL.

Ответы [ 3 ]

0 голосов
/ 14 января 2020

Я бы сделал это так:

with 
  team as (select  level lv from dual connect by level <= 3)
, bas  as (select '_Int_Sales_Count' n_count, 'International' type from dual
       union all select '_Dom_Sales_Count' n_count, 'Domestic' type from dual)
, permutations as 
     ( select 'Team' || lv ||n_count   as code,  'Team' || lv as team, type from team join bas on (1=1))
select * from permutations

, но с ограничениями:

select 'Team' || lv ||n_count   as code,  'Team' || lv as team, type from
      (select  level lv from dual connect by level <= 3) team,
      (select '_Int_Sales_Count' n_count, 'International' type from dual
           union all select '_Dom_Sales_Count' n_count, 'Domestic' type from dual) bas  
0 голосов
/ 14 января 2020

Кажется, вы хотите перекрестное соединение.

SELECT t.team || ct.code code,
       t.team,
       ct.type
       FROM (SELECT '_Int_Sales_Count' code,
                    'International' type
                    FROM dual
             UNION ALL
             SELECT '_Dom_Sales_Count' code,
                    'Domestic' type
                    FROM dual) ct
            CROSS JOIN (SELECT 'Team1' team
                               FROM dual
                        UNION ALL
                        SELECT 'Team2' team
                               FROM dual
                        UNION ALL
                        SELECT 'Team3' team
                               FROM dual) t;

db <> fiddle

0 голосов
/ 14 января 2020

Таблица перестановок может быть построена так:

SELECT
  Permutations.Code AS Code,
  COUNT(*) AS Count,
...
JOIN (SELECT * FROM (
        (SELECT 'Team1_Int_Sales_Count' AS Code, 'Team1' AS Team, 'International' AS Type FROM Dual),
  UNION (SELECT 'Team1_Dom_Sales_Count' AS Code, 'Team1' AS Team, 'Domestic'      AS Type FROM Dual),
  UNION (SELECT 'Team2_Int_Sales_Count' AS Code, 'Team2' AS Team, 'International' AS Type FROM Dual),
  UNION (SELECT 'Team2_Dom_Sales_Count' AS Code, 'Team2' AS Team, 'Domestic'      AS Type FROM Dual),
  UNION (SELECT 'Team3_Int_Sales_Count' AS Code, 'Team3' AS Team, 'International' AS Type FROM Dual),
  UNION (SELECT 'Team3_Dom_Sales_Count' AS Code, 'Team3' AS Team, 'Domestic'      AS Type FROM Dual)
)) AS Permutations
ON Permutations.Team = Sales.Team AND Permutations.Type = Sales.Type
WHERE...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...