SQL JOIN限制结果为不存在特定值的行

时间:2011-03-02 03:49:36

标签: sql join where-clause

我正在使用SQL加入两个表。我正在加入一张包含包机航班信息的表格和一张包含指派人员的表格。在我的结果中,我只想显示在工作人员表中只有“Pilot”值而不是“Copilot”或两者的行。

enter image description here

3 个答案:

答案 0 :(得分:3)

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。

EDIT2:我的SQL-Server正在抛出一个没有连接的东西,所以这也完全脱离了我的头脑,我认为这是一个黑客工作,但我认为它会完成这项工作。 :)
 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列)。

答案 1 :(得分:2)

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反加入是对给定行程的所有船员进行评估并检查任何非飞行员的行为。

答案 2 :(得分:1)

你应该真的帮助我们在这里使用架构为我们提供一个体面的查询。我认为最重要的是你如何确定谁是飞行员和/或副驾驶员,以及你如何将每个人与飞行联系起来。

我认为这样的事情可能有所帮助:

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

虽然这可能不是最干净的解决方案..它应该做的工作。