Sql select 不存在

Sql select with Not exists

我有一个 table 如下所示:

TABLE_A:

Value  position  List    vehicle
---------------------------------
A       123        No      ABC
A       123        No      CDA
A       124        No      CDA
A       125        No      ABC
B       126        Yes     XYZ

我想 select 每个职位的 TABLE_A 值。

如果列表设置为“否”并且位置有这辆车“ABC”并且位置中的值相同,那么我需要在 select 中忽略它。但是如果位置没有这辆车“ABC”并且列表设置为“NO”那么我需要select那一行。

我尝试使用“NOT EXISTS”,但是这个 return 对于位置 123 和 124 没有任何意义。我除了 return 位置 124 的值之外,但它没有。

SELECT * 
FROM TABLE_A
WHERE VEHICLE IS NOT NULL AND NOT EXISTS (SELECT vehicle FROM TABLE_A WHERE position = 125)
  AND position = 123;

SELECT * 
FROM TABLE_A
WHERE VEHICLE IS NOT NULL AND  NOT EXISTS (SELECT vehicle FROM TABLE_A WHERE position = 125)
  AND position = 124;

例如:如果我 select 位置为 124 的值,我希望它 return 该位置的所有值,因为它没有车辆 ID“ABC”,即使它有列表“ NO”,但如果我使用位置 123,那么它不应该 return 任何值,因为该位置有列表“NO”并且它有车辆“ABC”

如果我没理解错的话,你想要:

SELECT a.* 
FROM TABLE_A a
WHERE NOT (a.LIST = 'No' AND a.VEHICLE = 'ABC ') OR
      NOT EXISTS (SELECT 1
                  FROM TABLE_A a2
                  WHERE a2.position = a.position AND
                        NOT (a.LIST = 'No' AND a.VEHICLE = 'ABC')
                 );

即select所有不是123/No的行。然后 select 仅包含此类值的位置的所有行。

您只需添加 AND position = ?.

即可过滤外部查询中的特定位置

如果您想对一个位置执行此操作并且只需要一行,那么更简单的公式是:

select a.*
from table_a a
where a.position = XXX
order by (case when a.LIST = 'No' and a.VEHICLE = 'ABC' then 1 else 2 end) desc
fetch first one row only;