Sql 如何验证一个表列值仅包含另一个表列值的子集?
假设有两个表,分别称为表1和表2,如下所示 表1Sql 如何验证一个表列值仅包含另一个表列值的子集?,sql,oracle,Sql,Oracle,假设有两个表,分别称为表1和表2,如下所示 表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); 若上述查询返回
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的一个子集
有没有比此解决方案更好、更短的替代方法?您可以尝试以下查询:
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;
如果没有记录,则表示table2.val2仅包含table1.val1值的子集。您可以尝试以下查询:
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;
如果这未给出任何记录,则表示table2.val2仅包含table1.val1值的子集。您可以使用
不存在来查找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
的子集。您可以使用notexists
查找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
的一个子集,假设ID不可为null,我认为这是最简单的查询,它将提供表2中的所有记录
在表1.Val1中找不到Val2的地方:
SELECT t2.Id, t2.Val2
FROM Table2 t2
LEFT JOIN Table1 t1 ON t2.Val2 = t1.Val1
WHERE t1.Id IS NULL
假设ID不可为null,我认为这是最简单的查询,它将为您提供表2中的所有记录
在表1.Val1中找不到Val2的地方:
SELECT t2.Id, t2.Val2
FROM Table2 t2
LEFT JOIN Table1 t1 ON t2.Val2 = t1.Val1
WHERE t1.Id IS NULL
保证这一点的方法是创建外键约束。假设table1.id
是主键,您可以将其添加为:
alter table table2 add constraint fk_table2_val2
foreign key (val2) references table1(val1);
val1
应在表中声明为唯一
在执行此操作之前,您需要对可能不正确的val2
值执行一些操作。目前尚不清楚您希望如何处理这些问题:
- 将此类
val2
值设置为NULL
- 将此类
val2
值设置为“规范”值
- 将此类
val2
值添加到表1
- 删除具有此类
val2
值的行
如果没有关于如何做的指导,就很难提出具体的建议。保证这一点的方法是创建外键约束。假设table1.id
是主键,您可以将其添加为:
alter table table2 add constraint fk_table2_val2
foreign key (val2) references table1(val1);
select * from table2 where val2 not in (select val1 from table1);
val1
应在表中声明为唯一
在执行此操作之前,您需要对可能不正确的val2
值执行一些操作。目前尚不清楚您希望如何处理这些问题:
- 将此类
val2
值设置为NULL
- 将此类
val2
值设置为“规范”值
- 将此类
val2
值添加到表1
- 删除具有此类
val2
值的行
如果没有行动指南,就很难提出具体的建议
select * from table2 where val2 not in (select val1 from table1);
若上述查询返回任何结果,则val2列不是val1的子集。如果不是,它是val1的一个子集
若上述查询返回任何结果,则val2列不是val1的子集。如果不是,则它是val1的一个子集。在val1和val2之间进行右连接,并确保没有NULLsWith约束来强制引用完整性?假设val1列中没有未找到的val2值。但是我不确定。所以我想验证一下。在val1和val2之间进行正确连接,并确保没有NULLsWith约束来强制引用完整性?假设没有val1列中找不到的val2值。但是我不确定。所以我想验证一下。我认为你的答案应该改为表1(val1)而不是表1(id)。我认为你的答案应该改为表1(val1)而不是表1(id)