【问题标题】:How to verify a table column values only contains subset of another table column values?如何验证一个表列值仅包含另一个表列值的子集?
【发布时间】:2018-04-25 20:42:36
【问题描述】:

假设有两个表,分别称为 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 的子集。

有没有比这个解决方案更好、更短的替代方法?

【问题讨论】:

  • 在 val1 和 val2 之间进行右连接并确保没有 NULL
  • 具有强制参照完整性的约束?
  • 假设在 val1 列中没有 val2 值。但我不确定。所以我想验证一下。

标签: sql oracle


【解决方案1】:

您可以像这样使用NOT EXISTS 查找不在table1.val1 中的table2.val2

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

如果它返回一个空结果,那么table2.val2table1.val1 的子集。

【讨论】:

    【解决方案2】:

    假设 ID 不可为空,我认为这是最简单的查询,它将为您提供 table2 中的所有记录 其中 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
    

    【讨论】:

      【解决方案3】:

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

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

      val1 应在表中声明为唯一。

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

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

      没有指导,很难提出具体的建议。

      【讨论】:

      • 我认为你的答案应该改为 table1(val1) 而不是 table1(id)
      【解决方案4】:

      你可以试试这个查询:

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

      【讨论】:

        【解决方案5】:
        select * from table2 where val2 not in (select val1 from table1);  
        

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-27
          • 2012-06-29
          • 2011-06-06
          • 1970-01-01
          相关资源
          最近更新 更多