Как проверить, что значения столбцов таблицы содержат только подмножество значений других столбцов таблицы? - PullRequest
0 голосов
/ 25 апреля 2018

предположим, что есть две таблицы с именами table1 и table2 следующим образом:

table1

id | val1
--------
1   1
2   2
3   3
4   4
5   5

table2

id | val2
----------
1   2
2   4
3   5

Как проверить с помощью oracle sql, table2Столбец .val2 содержит только подмножество значений table1.val1.

Как насчет этого решения,

select * from table2 where val2 not in (select val1 from table1);

Если приведенный выше запрос возвращает какой-либо результат, тогда столбец val2 не является подмножеством val1.Если нет, то это subuet of val1.

Есть ли альтернативный способ сделать это лучше и короче, чем это решение?

Ответы [ 5 ]

0 голосов
/ 25 апреля 2018
select * from table2 where val2 not in (select val1 from table1);  

Если приведенный выше запрос возвращает какой-либо результат, столбец val2 не является подмножеством val1. Если нет, то это подуэлл val1.

0 голосов
/ 25 апреля 2018

Вы гарантируете это, создавая ограничение внешнего ключа.Предполагая, что table1.id является первичным ключом, вы можете добавить его как:

alter table table2 add constraint fk_table2_val2
    foreign key (val2) references table1(val1);

val1 должен быть объявлен как уникальный в таблице.

Перед этим вам необходимосделать что-то с val2 значениями, которые могут быть неверными.Неясно, что вы хотите с этим сделать:

  • Установите такие val2 значения в NULL.
  • Установите такие val2 значения в "каноническое" значение.
  • Добавление таких val2 значений к table1.
  • Удаление строк с такими val2 значениями.

Без указания, что делать, этотрудно сделать конкретное предложение.

0 голосов
/ 25 апреля 2018

Вы можете использовать NOT EXISTS, чтобы найти table2.val2, которые не находятся в table1.val1, как это

SELECT *
FROM table2 t2
WHERE NOT EXISTS(
  SELECT 1
  FROM table1 t1
  WHERE t1.val1 = t2.val2
)

и если он возвращает пустой результат, то table2.val2 является подмножеством table1.val1.

0 голосов
/ 25 апреля 2018

Предполагая, что ID не обнуляется, я думаю, что это самый простой запрос, который даст вам все записи в таблице 2, где Val2 не может быть найден в Table1.Val1:

SELECT t2.Id, t2.Val2
FROM Table2 t2
LEFT JOIN Table1 t1 ON t2.Val2 = t1.Val1
WHERE t1.Id IS NULL
0 голосов
/ 25 апреля 2018

Вы можете попробовать этот запрос:

SELECT * 
FROM
(
    SELECT
        t2.id as t2_id,
        t2.val2,
        t1.id as t1_id,
        t1.val1
    FROM
        table2 t2 LEFT JOIN table1 t1
            ON t2.val2 = t1.val1
) a

WHERE a.t1_id IS NULL;

Если это дает no records, это означает, что table2.val2 содержит только подмножество значений table1.val1.

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