SQL JOIN ограничивает результаты строками, в которых не существует определенного значения - PullRequest
1 голос
/ 02 марта 2011

Я объединяю две таблицы, используя SQL.Я присоединяюсь к таблице, которая содержит информацию о чартерном рейсе и таблицу, которая содержит назначенный экипаж.В моих результатах я только хочу отобразить строки, которые имеют только значение «Пилот» в таблице экипажа, а не «Второй пилот» или оба.

enter image description here

Ответы [ 3 ]

3 голосов
/ 02 марта 2011

SELECT * FROM TABLE_A JOIN TABLE_B ON (TABLE_A.Value = TABLE_B.Value) WHERE TABLE_A.OtherValue = 'Pilot'

Это не в моей голове, поэтому некоторый синтаксис может быть отключен. Основным пунктом является предложение WHERE. Вы можете указать значение, которое вы ищете в столбце (в вашем случае вы ищете Pilot).

РЕДАКТИРОВАТЬ: Чтобы предотвратить значение, вы можете сделать что-то вроде WHERE TABLE.VALUE != 'Copilot' != может потребоваться записать как <> в зависимости от того, что это за SQL.

РЕДАКТИРОВАТЬ2: Мой SQL-сервер шипит и не подключается, так что это также совершенно не в моей голове, и я думаю, что это немного хакерская работа, но я думаю, что это подойдет. :)
SELECT [CHARTER].*, COUNT(*) as Tally FROM [CHARTER] JOIN [CREW] ON ([CHARTER].[CHAR_TRIP] = [CREW].[CHAR_TRIP]) WHERE [CREW].[CREW_JOB] = 'PILOT' OR [CREW].[CREW_JOB] = 'COPILOT' GROUP BY [CHARTER].* HAVING Tally = 1
Это предполагает, что на всех рейсах есть пилот, но не на всех рейсах есть второй пилот. Чтобы получить точное отображение, которое вы хотите, вам, возможно, придется использовать его как подзапрос (чтобы удалить столбец Tally).

2 голосов
/ 02 марта 2011
SELECT *
FROM charter ch
JOIN crew cr ON ch.char_trip = cr.char_trip
WHERE NOT EXISTS(SELECT *
                   FROM crew cr2
                  WHERE cr2.char_trip = ch.char_trip
                    AND cr2.crew_job != 'PILOT')

Я думаю, что должно сработать.Присоединение к таблице экипажа в строке 3 является необязательным, и только если вам нужны результаты из этой таблицы.Анти-объединение NOT EXISTS - это то, что оценивает весь экипаж для данной поездки и проверяет всех, кто не является пилотом.

1 голос
/ 02 марта 2011

Вы должны действительно помочь нам с этой схемой, чтобы мы могли предоставить вам достойный запрос. Я думаю, что здесь самое важное, как вы определяете, кто является пилотом и / или вторым пилотом, и как вы относите каждого человека к полету.

Я думаю, что-то вроде этого может помочь:

SELECT * FROM Charter C
INNER JOIN Crew ON (Charter.CHAR_TRIP = Crew.CHAR_TRIP)
WHERE Crew.Crew_Job = 'PILOT' AND (SELECT COUNT(*) FROM Charter
                                   INNER JOIN Crew ON (Charter.CHAR_TRIP = Crew.CHAR_TRIP)
                                   WHERE Crew.Crew_Job = 'CoPilot' 
                                         AND Charter.Chart_Trip = C.ChartTrip) = 0

Хотя это может быть не самое чистое решение .. оно должно делать всю работу.

...