2011-03-02 27 views
1

我正在使用SQL连接两个表。我正在加入一张载有包机信息的表格和一张载有指定人员的表格。在我的结果中,我只想显示船员表中只有“Pilot”值的行,而不是“Copilot”或两者。SQL JOIN将结果限制为不存在特定值的行

enter image description here

+0

请张贴您的餐桌结构,以便我可以更清楚地说明这一点。 – 2011-03-02 03:54:07

+0

Try @ Nija的帖子。你可以添加你的表结构..你需要内部连接ID的和过滤使用where @ Table = value。 – Crimsonland 2011-03-02 03:57:11

+0

我加了相关的ERD。 – 2011-03-02 03:58:06

回答

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 

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

+0

我添加了相关表的ERD。 CREW_JOB将包含“Pilot”或“Copilot”。我会加入他们CHAR_TRIP这将是唯一的旅行ID。 – 2011-03-02 04:06:28

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。编辑2:我的SQL服务器投掷hissy,而不是连接,所以这也是完全关闭我的头顶,我认为这是一个黑客工作,但我认为它会做的工作。 :)
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列)。

+0

是的,但我不仅想将结果限制为值为“Pilot”的行。例如,如果我有一个Pilot和一个CoPilot用于特定的特许身份证,我只想要那些只有飞行员而不是副驾驶员,或者驾驶员和副驾驶的人员。 – 2011-03-02 03:57:22

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行中的船员表的连接是可选的,并且只有当您需要该表格的结果时才可以。不存在反联接是评估所有机组人员进行特定行程并检查任何不是飞行员的信息。