假设有两个名为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的子地板。
有没有其他方法可以比这个解决方案做得更好更短?
答案 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.val2
是table1.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的子地板。