Выбор записи с несколькими значениями в двух таблицах - PullRequest
0 голосов
/ 30 мая 2019

В двух таблицах есть записи (цвета) с разными значениями. Я хочу, чтобы в результате отображались только те цвета, которые имеют одинаковые значения в обеих таблицах. Если какое-либо из значений отсутствует, оно должно быть полностью отклонено.

enter image description here

Другой пример:

Сильфон должен возвращать только BLUE

WITH
t1 as (SELECT 'RED' as COLOUR, ('1') as VALUESY FROM DUAL
       UNION
       SELECT 'RED' as COLOUR, ('2') as VALUESY FROM DUAL
       UNION
       SELECT 'BLUE' as COLOUR, ('1') as VALUESY FROM DUAL
       UNION
       SELECT 'BLUE' as COLOUR, ('2') as VALUESY FROM DUAL),

t2 as (SELECT 'RED' as COLOUR, ('1') as VALUESY FROM DUAL
       UNION
       SELECT 'RED' as COLOUR, ('3') as VALUESY FROM DUAL
       UNION
       SELECT 'BLUE' as COLOUR, ('1') as VALUESY FROM DUAL
       UNION
       SELECT 'BLUE' as COLOUR, ('2') as VALUESY FROM DUAL)

SELECT *
FROM t1
FULL OUTER JOIN t2 ON t2.VALUESY = t1.VALUESY AND t2.COLOUR = t1.COLOUR

Ответы [ 3 ]

2 голосов
/ 30 мая 2019

Есть несколько способов сделать это, один из них - выполнить FULL OUTER JOIN, а затем GROUP BY COALESCE( t1.COLOUR, t2.COLOUR ) и подсчитать, есть ли какие-либо значения NULL по обе стороны от соединения;если есть, то есть несопоставленное значение (при условии, что ни одно из входных значений не равно NULL:

Настройка Oracle :

CREATE TABLE t1 ( colour, valuesy ) as 
  SELECT 'RED',  '1' FROM DUAL UNION
  SELECT 'RED',  '2' FROM DUAL UNION
  SELECT 'BLUE', '1' FROM DUAL UNION
  SELECT 'BLUE', '2' FROM DUAL

CREATE TABLE t2 ( colour, valuesy ) as 
  SELECT 'RED',  '1' FROM DUAL UNION
  SELECT 'RED',  '3' FROM DUAL UNION
  SELECT 'BLUE', '1' FROM DUAL UNION
  SELECT 'BLUE', '2' FROM DUAL

Запрос:

SELECT COALESCE( t1.COLOUR, t2.COLOUR ) AS COLOUR
FROM t1
     FULL OUTER JOIN t2
     ON t2.VALUESY = t1.VALUESY AND t2.COLOUR = t1.COLOUR
GROUP BY COALESCE( t1.COLOUR, t2.COLOUR )
HAVING COUNT( CASE WHEN t1.COLOUR IS NULL OR t2.COLOUR IS NULL THEN 1 END ) = 0

Выход :

| COLOUR |
| :----- |
| BLUE   |

db <> Fiddle здесь

0 голосов
/ 30 мая 2019

Вы также можете использовать следующий запрос.

WITH
t1 as (SELECT 'RED' as COLOUR, ('1') as VALUESY FROM DUAL
       UNION
       SELECT 'RED' as COLOUR, ('2') as VALUESY FROM DUAL
       UNION
       SELECT 'BLUE' as COLOUR, ('1') as VALUESY FROM DUAL
       UNION
       SELECT 'BLUE' as COLOUR, ('2') as VALUESY FROM DUAL),

t2 as (SELECT 'RED' as COLOUR, ('1') as VALUESY FROM DUAL
       UNION
       SELECT 'RED' as COLOUR, ('3') as VALUESY FROM DUAL
       UNION
       SELECT 'BLUE' as COLOUR, ('1') as VALUESY FROM DUAL
       UNION
       SELECT 'BLUE' as COLOUR, ('2') as VALUESY FROM DUAL)
--
-- query starts from here
--
SELECT
    T1.COLOUR
FROM
    (
        SELECT
            T1.COLOUR,
            LISTAGG(T1.VALUESY) WITHIN GROUP(
                ORDER BY
                    T1.VALUESY
            ) VAL
        FROM
            T1
        GROUP BY
            T1.COLOUR
    ) T1,
    (
        SELECT
            T2.COLOUR,
            LISTAGG(T2.VALUESY) WITHIN GROUP(
                ORDER BY
                    T2.VALUESY
            ) VAL
        FROM
            T2
        GROUP BY
            T2.COLOUR
    ) T2
WHERE
    T1.COLOUR = T2.COLOUR
    AND T1.VAL = T2.VAL;

Спасибо.

0 голосов
/ 30 мая 2019
SELECT t1.COLOR, t1.VALUE 
FROM TABLE1 t1 
INNER JOIN TABLE2 t2 ON (t1.COLOR = t2.COLOR) AND (t1.VALUE = t2.VALUE);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...