Как запросить разные строки из одной таблицы - PullRequest
0 голосов
/ 28 марта 2019
RowNum  ,Source_element,    source_value

1   ,    header1      ,      mail
1   ,    header2     ,       location
1   ,    header3     ,       address

2   ,    header1       ,     mail
2   ,    header2    ,        location
2   ,    header3    ,        US

3   ,    header1       ,     Email
3   ,    header2       ,     location
3   ,    header3      ,      Canada

Над столом, который у меня есть. В настоящее время в качестве примера я использую 3 записи для каждого Rownum, но это может быть любая запись на основе исходного файла, который мы получаем

Мне нужно написать запрос, где

если header1 = mail и header3 = US для любого заданного rownum, то извлечь этот rownum 2

или

если header1 = электронная почта и header2 = местоположение и header3 = Канада, тогда извлеките rownum 3

Любые выводы действительно помогли бы мне ... я совершенно не знаю, как поступить.

Ответы [ 3 ]

0 голосов
/ 28 марта 2019

Не элегантно, но:

    CREATE TABLE Demo
    (
     Row_Num        VARCHAR2(0016)
    ,Source_Element VARCHAR2(0016)
    ,Source_Value   VARCHAR2(0016)
    );

INSERT INTO Demo (Row_Num,Source_Element,Source_Value)
SELECT * FROM
(
      SELECT '1' AS Row_Num, 'header1' AS Source_Element, 'mail' AS Source_Value FROM dual
UNION SELECT '1' AS Row_Num, 'header2' AS Source_Element, 'location' AS Source_Value FROM dual
UNION SELECT '1' AS Row_Num, 'header3' AS Source_Element, 'address' AS Source_Value FROM dual
--
UNION SELECT '2' AS Row_Num, 'header1' AS Source_Element, 'mail' AS Source_Value FROM dual
UNION SELECT '2' AS Row_Num, 'header2' AS Source_Element, 'location' AS Source_Value FROM dual
UNION SELECT '2' AS Row_Num, 'header3' AS Source_Element, 'US' AS Source_Value FROM dual
--
UNION SELECT '3' AS Row_Num, 'header1' AS Source_Element, 'Email' AS Source_Value FROM dual
UNION SELECT '3' AS Row_Num, 'header2' AS Source_Element, 'location' AS Source_Value FROM dual
UNION SELECT '3' AS Row_Num, 'header3' AS Source_Element, 'Canada' AS Source_Value FROM dual
);

SELECT row_num
FROM
(
SELECT
     h1.row_num
    ,h1.source_value        AS Header_1
    ,h2.source_value        AS Header_2
    ,h3.source_value        AS Header_3
FROM demo h1
    --
    JOIN demo h2
        ON h2.row_num = h1.row_num
    --
    JOIN demo h3
        ON h3.row_num = h2.row_num
WHERE (1 = 1)
  AND h1.source_element = 'header1'
  AND h2.source_element = 'header2'
  AND h3.source_element = 'header3'
)
WHERE (1 = 1)
  AND header_1 = 'mail'
  AND header_3 = 'US'
;
0 голосов
/ 28 марта 2019

Это звучит как случай, когда вы хотите использовать PIVOT.Примерно так:

SELECT "RowNum" FROM
(
  SELECT "RowNum", source_element, source_value
  FROM testtable
)
PIVOT
(
  max(source_value)
  FOR source_element IN ('header1','header2','header3')
)
WHERE
 ("'header1'"='mail' and "'header3'"='US')
 OR
 ("'header1'"='Email' and "'header2'"='location' and "'header3'"='Canada')
;

Вот пример работы с вашими примерами данных.

Основная идея заключается в том, что PIVOT поворачивает ваш заголовок1/ header2 / header3 строки в столбцы, и вы можете применить условие к одной строке.

0 голосов
/ 28 марта 2019

Мне неясно, что вы на самом деле хотите, но отправной точкой является использование условного агрегирования.Это CASE выражения и MIN(), MAX(), SUM() агрегатные функции.

Например ...

WITH
  pivoted AS
(
  SELECT
    rownum,
    MAX(CASE WHEN source_element = 'header1' THEN source_value END) AS header1,
    MAX(CASE WHEN source_element = 'header2' THEN source_value END) AS header2,
    MAX(CASE WHEN source_element = 'header2' THEN source_value END) AS header3
  FROM
    yourTable
  GROUP BY
    rownum
)
SELECT
  <something>
FROM
  pivoted
WHERE
  (header1='mail' AND header3='US')
  OR
  (header1='Email' AND header2='location' AND header3='Canada')

Надеюсь, это поможет вам начать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...