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

Sql 如何验证一个表列值仅包含另一个表列值的子集?,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); 若上述查询返回

假设有两个表,分别称为表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);
若上述查询返回任何结果,则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)