Я пытаюсь получить только одну из двух строк с учетом следующей таблицы:
| fn1 | o1 | d1 | date | fn2 | o2 | d2 |
------------------------------------------------------
| 1 | ATL | PEK | 2018-09-29 | 7 | PEK | ATL |
| 7 | PEK | ATL | 2018-09-29 | 1 | ATL | PEK |
Я буду называть первую строку как R1, а вторую - как R2.
В общем случае мне нужно проверить, что:
R1.fn1 = R2.dn2 AND R1.fn2 = R2.fn1 AND R1.o1 = R1.d2 = R2.d1 = R2.o1 ANDR1.d1 = R1.o2 = R2.o1 = R2.d2 AND R1.date = R2.date
Если это верно для любых двух заданных строк в моей таблице, мне нужно сгруппировать их потолько один.Я не знаю, есть ли способ решить это, используя Group By или Distinct.Я пробовал несколько запросов, но в конце концов не смог удалить избыточность.
Чтобы получить больше информации, я объясню, откуда взялась таблица.У меня есть следующая таблица:
CREATE TABLE flights (
flightNumber SERIAL PRIMARY KEY,
origin CHAR(3) REFERENCES airports(code),
destination CHAR(3) REFERENCES airports(code),
departureTime TIMESTAMP NOT NULL,
seatsNumber INT NOT NULL,
airlineAbv VARCHAR(10) REFERENCES airlines(abv));
Мне нужен запрос, чтобы проверить возможные поездки в тот же день.Для этого я использовал:
CREATE VIEW AtoB AS
SELECT flightNumber fN1, origin o1, destination d1, departureTime::DATE dT1
FROM flights;
CREATE VIEW BtoA AS
SELECT flightNumber fN2, origin o2, destination d2, departureTime::DATE dT2
FROM flights;
CREATE VIEW AtoBtoA AS
SELECT * FROM AtoB, BtoA WHERE o1 = d2 AND o2 = d1 AND dT1 = dT2;
И из последнего запроса я получаю таблицу, очень похожую на таблицу в примере.Тот, что в примере, немного проще, так что легче объяснить концепцию того, чего я хочу достичь.
Надеюсь, я прояснил свою проблему.
PS: Здесь у вас естьВся моя база данных, чтобы увидеть дизайн.Я думаю, это может быть полезно.
CREATE TABLE airports (
code CHAR(3) PRIMARY KEY,
city VARCHAR(30) NOT NULL
);
CREATE TABLE airlines (
name VARCHAR(30) NOT NULL,
abv VARCHAR(10) PRIMARY KEY
);
CREATE TABLE passengers (
id SERIAL PRIMARY KEY,
name VARCHAR(60) NOT NULL
);
CREATE TABLE flights (
flightNumber SERIAL PRIMARY KEY,
origin CHAR(3) REFERENCES airports(code),
destination CHAR(3) REFERENCES airports(code),
departureTime TIMESTAMP NOT NULL,
seatsNumber INT NOT NULL,
airlineAbv VARCHAR(10) REFERENCES airlines(abv)
);
CREATE TABLE bookings (
passengerId INT REFERENCES passengers(id),
bookDate TIMESTAMP NOT NULL,
price REAL NOT NULL,
flightId INT REFERENCES flights(flightNumber)
);