我有一个假表,如下图所示,显示谁拥有食物。null
意味着这些食物是共同拥有的。我想通过一个查询来获得该食物的所有者拥有哪些食物。比如说老板A,输出的结果就是下面的输出。如果所有者也拥有共同拥有的东西,输出将只打印'2',而不是'1'& '2'。我试过用以下方法查询 not exist
但还是无法打通逻辑。如何才能实现我想要的逻辑?谢谢
Table t:
ID OWNER FOOD
1 null rice
2 A rice
3 B apple
4 null orange
Output:
ID OWNER FOOD
2 A rice
4 null orange
Tried query:
SELECT *
FROM table t
WHERE t.OWNER= 'A'
AND NOT EXISTS ( ....
)
你可以尝试使用这个存在逻辑。
SELECT *
FROM yourTable t1
WHERE
OWNER = 'A' OR
(OWNER IS NULL AND NOT EXISTS (SELECT 1 FROM yourTable t2
WHERE t2.FOOD = t1.FOOD AND t2.OWNER = 'A'));
这里的逻辑是保留任何记录,其中的所有者是。A
, 或 任何记录的所有者为null,只要我们还没有包含一个 A
与该无效记录相同的食物的记录。
编辑。
如果你需要上述查询运行得更快,你可以通过添加以下复合索引来优化它。
CREATE INDEX idx ON yourTable (OWNER, FOOD);
这样可以加快 WHERE
子句,同时也加快了existence的查找速度。