【问题标题】:Sql select with Not existsSql 选择不存在
【发布时间】:2021-07-02 01:57:08
【问题描述】:

我有一张如下表:

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

我想从 TABLE_A 中为每个位置选择值。

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

我尝试使用“NOT EXISTS”,但这不会返回位置 123 和 124 的任何值。除此之外,我会返回位置 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;

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

【问题讨论】:

  • 去掉NOT EXISTS (......)行末尾的分号;-
  • 您的存在与您的外部查询无关。存在的position 指向哪个表?引擎无法读懂您的想法,并可能将其应用于外部查询。使用别名
  • 编辑您的问题并显示您想要的结果。
  • @GordonLinoff 完成了

标签: sql select where-clause oracle12c not-exists


【解决方案1】:

如果我理解正确,你想要:

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')
                 );

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

您可以通过添加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;

【讨论】:

  • 第一个查询很好,但在位置 123 的情况下不起作用。它返回车辆不是“ABC”的行。如果位置包含车辆“ABC”和任何其他车辆,则查询不应返回任何值。
  • @newintodev 。 . .我混淆了 ABC 和 123。我确定了答案。
猜你喜欢
  • 2017-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-21
  • 1970-01-01
  • 2011-10-07
  • 1970-01-01
  • 2014-12-15
相关资源
最近更新 更多