如何验证表列值只包含另一个表列值的子集?

时间:2018-04-25 10:04:43

标签: sql oracle

假设有两个名为table1和table2的表,如下所示,

表1

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

表2

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的子集。如果不是,它是val1的子地板。

有没有其他方法可以比这个解决方案做得更好更短?

5 个答案:

答案 0 :(得分:1)

您可以使用NOT EXISTS查找不在table2.val2内的table1.val1

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

如果它返回空结果,则table2.val2table1.val1的子集。

答案 1 :(得分:1)

假设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

答案 2 :(得分:1)

您保证这一点的方法是创建外键约束。假设table1.id是主键,您可以添加一个:

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

val1应在表格中声明为唯一。

在执行此操作之前,您需要对可能不正确的val2值执行某些操作。目前还不清楚你想对这些做些什么:

  • 将此类val2值设置为NULL
  • 将此类val2值设置为“规范”值。
  • 将此类val2值添加到table1
  • 删除具有此类val2值的行。

如果没有指导如何做,很难提出具体的建议。

答案 3 :(得分:0)

您可以尝试此查询:

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值的子集。

答案 4 :(得分:0)

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

如果上面的查询返回任何结果,则val2列不是val1的子集。如果不是,它是val1的子地板。