我正在使用 Oracle SQL,我需要确保我的所有项目恰好位于 5 个特定位置,如下所示。我的 SQL 不够好,无法获得正确的语法。我面临的问题是我的物品仅位于 5 个位置中的少数几个,我需要找到丢失的物品,然后将其手动上传到数据库中。
这正是我希望在这些地点实现我的所有物品的目标。
问题是数据库表有很多位置,但我只需要查找 5 个特定位置中任何一个缺少该项目的记录,这 5 个特定位置是奥斯汀、波士顿、芝加哥、达拉斯和休斯顿。 在下面的屏幕截图中,红色的是我试图通过 SQL 获取的内容。
下面是我想要 SQL 输出的内容。如上所述,一旦找到丢失的记录,我就会手动将它们上传到数据库中。任何有关 SQL 的帮助都会非常有帮助。预先感谢
使用简化的数据,因为您只提供了图像。
如果我们要检查是否缺少苹果和猕猴桃。
基本原理 - 交叉连接创建我们想要看到的所有 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 | 猕猴桃 |
使用
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;