Получить правильные записи на основе столбца от объединения, которые используются в соединении - PullRequest
0 голосов
/ 27 февраля 2020

Этот выбор используется как left outer join в пакете:

 SELECT * (SELECT db1.id, db2.value, db1.discount, 2 AS attr_number FROM database1 db1
      JOIN database2 db2 ON db2.db1_id = db1.id
    WHERE db2.value = 1
    UNION
    SELECT db1.id, db4.value, db1.discount, 1 AS attr_number FROM database1 db1
      JOIN database4 db4 ON db4.db1_id = db1.id
    WHERE db4.value = 1) WHERE id = 225

Он возвращает мне эти записи:

|ID           |VALUE             |DISCOUNT          |ATTR_NUMBER       |
|-------------|------------------|------------------|------------------|
|225          |1                 |50                |2                 |
|225          |1                 |50                |2                 |
|225          |1                 |40                |1                 |
|225          |1                 |40                |1                 |
|225          |1                 |40                |1                 |

Так что мне нужно принять во внимание строку attr_number и извлекать записи на основе этого поля.

Как видите, значение строки attr_number может быть только 1 или 2.

В этом примере записи существуют с обоими значениями, в данном случае нам нужно возвращать только туда, где attr_number = 1 (потому что он существует), так что это пример того, что он должен вернуть:

|ID           |VALUE             |DISCOUNT          |ATTR_NUMBER       |
|-------------|------------------|------------------|------------------|
|225          |1                 |40                |1                 |
|225          |1                 |40                |1                 |
|225          |1                 |40                |1                 |

Как видите, он «удалил» записи, где attr_number = 2 и вернул только там, где это 1.

В другом случае, если select не возвращает записи, где attr_number = 1, он возвращает все остальные записи, в этом случае это будет где attr_number = 2. Вот пример того, что он должен вернуть в этом случае:

|ID           |VALUE             |DISCOUNT          |ATTR_NUMBER       |
|-------------|------------------|------------------|------------------|
|225          |1                 |50                |2                 |
|225          |1                 |50                |2                 |

Надеюсь, мои объяснения достаточно ясны.

Ответы [ 2 ]

1 голос
/ 27 февраля 2020

Вы можете использовать RANK для ранжирования ваших результатов и сохранения только лучших строк (т. Е. С более низкими attr_number).

select db1.id, 1 as value, db1.discount, dbx.attr_number
from database1 db1
join
(
  select db1_id, attr_number, rank() over (order by attr_number) as rn
  from
  (
    select db1_id, 2 as attr_number from database2 db2 where value = 1
    union all
    select db1_id, 1 as attr_number from database4 db4 where value = 1
  )
) dbx on dbx.db1_id = db1.id and dbx.rn = 1
where db1.id = 225;
0 голосов
/ 27 февраля 2020

Создайте 2 CTE s, по одному для каждого из ваших объединенных запросов, а затем используйте NOT EXISTS:

WITH 
  cte1 AS (
    SELECT db1.id, db4.value, db1.discount, 1 AS attr_number 
    FROM database1 db1 JOIN database4 db4 
    ON db4.db1_id = db1.id
    WHERE id = 225 AND value = 1
  ),
  cte2 AS (
    SELECT db1.id, db2.value, db1.discount, 2 AS attr_number 
    FROM database1 db1 JOIN database2 db2 
    ON db2.db1_id = db1.id
    WHERE id = 225 db2.value = 1
  )
SELECT * FROM cte1
UNION ALL
SELECT * FROM cte2
WHERE NOT EXISTS (SELECT 1 FROM cte1 WHERE attr_number = 1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...