sql - 在 Oracle 中查询以使用子查询进行选择

标签 sql oracle date select constraints

我的 Oracle 数据库中有下表:

CREATE TABLE test
(
 flight NUMBER(4),
 date   DATE,
 action VARCHAR2(50),
 CONSTRAINT pk PRIMARY KEY (flight,date)
);

和以下寄存器:

BEGIN
 INSERT INTO test VALUES ('1234', '2020-02-29 18:00', 'Departure');
 INSERT INTO test VALUES ('1234', '2020-02-29 19:00', 'Arrival');

 INSERT INTO test VALUES ('4321', '2020-02-20 22:00', 'Departure');
 INSERT INTO test VALUES ('4321', '2020-02-21 04:30', 'Arrival');
END;
/

我的问题是我想做一个 SELECT,它只在航类当天起飞和到达时返回我的航类号。例如,航类“1234”于第 29 天起飞并于第 29 天到达,但另一方面,航类“4321”于第 20 天起飞并于第 21 天到达。我只想选择航类“1234” ',因为只有它符合要求。

一直在想下面的select,但是不行,因为子查询返回的不止一个值:

SELECT flight
  FROM test
 WHERE action = 'Departure'
   AND TO_CHAR(date, 'YYYY-MM-DD') = (SELECT TO_CHAR(date, 'YYYY-MM-DD')
                                        FROM test
                                       WHERE action = 'Arrival');

非常感谢。

最佳答案

您只需要在一天内采取不同的行动。因此,使用 HAVING 明确计数两个单独的操作 GROUPed BY flight 和 day :

SELECT flight
  FROM test
 WHERE action in ('Departure','Arrival')
 GROUP BY flight, trunc("date")
HAVING COUNT(distinct action)=2

应该有distinct子句的地方,如果扩展样本数据集需要观察

Demo

  • date 是保留关键字,不能用作 Oracle 数据库的列名。所以,我更喜欢 "date"
  • timestamp关键字作为时间字面量的前缀,并在末尾添加:00部分来表示second,例如插入时的时间戳'2020-02-21 04:30:00'

关于sql - 在 Oracle 中查询以使用子查询进行选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60464317/

相关文章:

URL 中的 PHP/MySQL 变量 - 文本被剥离,数字部分仅用于选择数据库记录

mysql - SQL-模式匹配无输出

sql - 使每隔一行的值出现在新的第三列中

java - 如何选择特定日期(当 : type = "date") in Selenium WebDriver?

date - 如何使用 HTML5 时间标签标记日期范围?

sql - 有没有一种方法可以从 SQL 查询中获取总数?

c# - 不支持的列数据类型 ODP.NET

java - 更新两个数据库时如何保证事务管理

javascript - 如何查找最小/最大日期 javascript

sql - Firebird 触发 SQL 验证查询