我的 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
子句的地方,如果扩展样本数据集需要观察
date
是保留关键字,不能用作 Oracle 数据库的列名。所以,我更喜欢"date"
- 用
timestamp
关键字作为时间字面量的前缀,并在末尾添加:00
部分来表示second
,例如插入时的时间戳'2020-02-21 04:30:00'
关于sql - 在 Oracle 中查询以使用子查询进行选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60464317/