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;
我有一个 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;