SQL 查找一张表中缺失的记录

问题描述 投票:0回答:2

我正在使用 Oracle SQL,我需要确保我的所有项目恰好位于 5 个特定位置,如下所示。我的 SQL 不够好,无法获得正确的语法。我面临的问题是我的物品仅位于 5 个位置中的少数几个,我需要找到丢失的物品,然后将其手动上传到数据库中。

这正是我希望在这些地点实现我的所有物品的目标。

问题是数据库表有很多位置,但我只需要查找 5 个特定位置中任何一个缺少该项目的记录,这 5 个特定位置是奥斯汀、波士顿、芝加哥、达拉斯和休斯顿。 在下面的屏幕截图中,红色的是我试图通过 SQL 获取的内容。

下面是我想要 SQL 输出的内容。如上所述,一旦找到丢失的记录,我就会手动将它们上传到数据库中。任何有关 SQL 的帮助都会非常有帮助。预先感谢

sql oracle-sqldeveloper
2个回答
0
投票

使用简化的数据,因为您只提供了图像。

如果我们要检查是否缺少苹果和猕猴桃。

基本原理 - 交叉连接创建我们想要看到的所有 id 和 value 对。减去删除我们实际看到的那些。结果就是缺少的东西。只要您不处理大量数据,交叉连接就不会太痛苦。

小提琴:https://dbfiddle.uk/zexvXlAg

身份证 水果
1 苹果
1 橙色
1 猕猴桃
2 梨子
3 苹果
create table some_test_data
  (
    id int,
    fruit varchar(255)
  );

insert into some_test_data values 
  (1,'apple'),
  (1,'orange'),
  (1,'kiwi'),
  (2,'pear'),
  (3,'apple');

with required_domain as 
  (
   select all_ids.id,
          x.fruit
     from (values ('apple') , ('kiwi'))  as X(fruit)
    cross
     join (select distinct
                  id
             from some_test_data 
          ) all_ids
  )
select id,
       fruit
  from required_domain
 minus
select id,
       fruit
  from some_test_data;
身份证 水果
2 苹果
2 猕猴桃
3 猕猴桃

0
投票

使用

PARTITION
ed
OUTER JOIN

WITH locations (location) AS (
  SELECT 'Austin' FROM DUAL UNION ALL
  SELECT 'Boston' FROM DUAL UNION ALL
  SELECT 'Chicago' FROM DUAL UNION ALL
  SELECT 'Dallas' FROM DUAL UNION ALL
  SELECT 'Houston' FROM DUAL
)
SELECT t.code,
       l.location
FROM   locations l
       LEFT OUTER JOIN your_table t
       PARTITION BY (t.code)
       ON (l.location = t.locations)
WHERE  t.locations IS NULL;
© www.soinside.com 2019 - 2024. All rights reserved.