【问题标题】:SQL JOIN limit results to rows where specific value does not existSQL JOIN 将结果限制为特定值不存在的行
【发布时间】:2011-07-06 23:56:40
【问题描述】:

我正在使用 SQL 连接两个表。我加入了一个包含包机信息的表格和一个包含分配的机组人员的表格。在我的结果中,我只想显示在船员表中只有“Pilot”值而不是“Copilot”或两者兼有的行。

【问题讨论】:

  • 请张贴您的表格结构,以便我更清楚地理解这一点。
  • 试试@Nija 的帖子。你能添加你的表结构吗?你需要内部连接 ​​id 并使用 where @Table=value 过滤它。

标签: sql join where-clause


【解决方案1】:

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 列)。

【讨论】:

  • 是的,但我不仅想将结果限制为值为“Pilot”的行。例如,如果我有一个特定包机 ID 的 Pilot 和 CoPilot,我只想要在工作人员表中只有飞行员而不是副驾驶或飞行员和副驾驶的行。
【解决方案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 反加入是评估给定行程的所有机组人员并检查任何不是飞行员的人员。

【讨论】:

    【解决方案3】:

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

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

    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
    

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

    【讨论】:

    • 我为相关表格添加了 ERD。 CREW_JOB 将包含“Pilot”或“Copilot”。我会加入他们的 CHAR_TRIP,这将是这次旅行的唯一 ID。
    猜你喜欢
    • 1970-01-01
    • 2017-03-20
    • 2021-06-24
    • 2011-03-23
    • 2014-06-03
    • 1970-01-01
    • 1970-01-01
    • 2015-01-19
    • 1970-01-01
    相关资源
    最近更新 更多