【问题标题】:SQL select where matching record exists and no matching recordSQL 选择匹配记录存在且没有匹配记录的位置
【发布时间】:2010-10-06 00:56:50
【问题描述】:

我需要交叉引用 2 个表。

tb1 内是booking_ref,投资者

在 tb2 内是 booking_ref、投资者、成本

问题是如果没有成本,表 2 中就不会创建记录

所以我有以下查询...

SELECT 
  tb1.booking_ref, tb1.investor, tb2.cost 
FROM 
  tb1, tb2 
WHERE 
  tb1.booking_ref = tb2.booking_ref 
AND 
  tb1.investor = tb2.investor 
AND 
  tb1.investor = ''12345''

这会显示所有在 tb2 中有匹配的 booking_ref 的预订,但我还需要显示没有匹配的 booking_ref 的预订

有什么想法吗??

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    在这种情况下,您需要左连接。

    SELECT 
      tb1.booking_ref, tb1.investor, tb2.cost 
    FROM 
      tb1
          left join tb2 
              on tb1.booking_ref = tb2.booking_ref
                  and tb1.investor = tb2.investor 
    WHERE tb1.investor = ''12345''
    

    【讨论】:

    • +1 [BANG]已发布答案[/BANG]。可能需要 isnull 或合并成本。
    • 或者如果您只想要 tb2 记录丢失的情况,请添加 WHERE 条件“并且 tb2.booking_ref IS NULL”
    【解决方案2】:

    LEFT JOIN

    我打算发布一个示例,但有几个人抢了我。

    不过,仅供参考,您的帖子使用的是隐式 INNER JOIN 语法。答案/示例使用了所谓的 Explicit JOIN 语法。

    Explicit vs implicit SQL joins

    我习惯于总是使用 Explicit JOIN 语法,即使对于 INNER JOINs,它看起来更令人困惑,但它更一致,因为您需要将它用于 LEFT JOINs 和 FULL OUTER JOINs .

    顺便说一句,LEFT JOIN 是 LEFT OUTER JOIN 的同义词,但确切的语法取决于您的 RDBMS。而 RIGHT JOIN 在技术上是多余的,因为您仍然可以使用 LEFT JOIN 关键字,并且只需反转 SQL 中表的顺序即可。

    【讨论】:

    • +1 同意用词不当,良好的基础知识,但我不同意你的观点,我认为 INNER JOIN 语法更清晰
    • +1 表示始终使用显式连接。但是我也认为显式连接语法(更)清晰。
    • 谢谢大家!我的意思是,隐式 JOIN 语法可能对尚未学习显式 JOIN 语法的人更有意义和有用。但是,我绝对认为最基本的 SQL 技能应该包括理解关系 JOINs 的所有“输入”和“输出”,因此明确的 JOIN 语法。我也更喜欢所有查询的显式语法。
    【解决方案3】:
    select t1.booking_ref, t1.investor, t2.cost
    from tb1 t1
    left join tb2 t2 
         on t1.booking_ref = t2.booking_ref
         and t1.investor = t2.investor
    where t1.investor = '12345'
    

    【讨论】:

      【解决方案4】:

      试试这个:

      SELECT  tb1.booking_ref, 
                tb1.investor, 
                tb2.cost 
      FROM      tb1 left outer join
                tb2 on tb1.booking_ref = tb2.booking_ref
      where    tb1.investor = tb2.investor
      and    tb1.investor = '12345'
      and (       tb1.booking_ref = tb2.booking_ref
              or     tb2.booking_ref is null)
      

      【讨论】:

      • 没有。 tb1.investor = tb2.investor 是两个表之间连接条件的一部分。像您所做的那样将此条件放在 where 子句中将使您的左连接表现得像一个内连接。
      • 是的,关于投资者,我认为这就是他从最后的问题措辞中想要的:S
      【解决方案5】:

      查看 SQL 为您提供的不同类型的连接,例如左连接、右连接、完全连接。这个网站有一个很好的参考来帮助你入门:http://www.w3schools.com/sql/sql_join.asp。了解每个联接将帮助您完成什么,一旦您做到了,我相信您会有答案。

      【讨论】:

        【解决方案6】:

        LEFT JOIN是你的人-

        SELECT 
          tb1.booking_ref, tb1.investor, tb2.cost 
        FROM 
          tb1 LEFT JOIN tb2 
        ON
          tb1.booking_ref = tb2.booking_ref 
        AND 
          tb1.investor = tb2.investor 
        AND 
          tb1.investor = '12345'
        

        【讨论】:

        • 仅供参考 - 外层是隐含的......你可以节省一些击键。
        • 您没有为左联接指定ON 条件。你会在这个查询中得到一个语法错误。
        • 感谢您的纠正...复制粘贴了他的示例,同时匆匆浏览它..没有意识到...无论如何你都打败了我...
        【解决方案7】:

        没有说明服务器...但是如果他在 8i 之前的 Oracle 中,我认为内连接或左连接语法不起作用。如果您使用的是早期的 oracle 版本,请使用 (+) 进行外部连接。

        选择
        tb1.booking_ref、tb1.investor、tb2.cost
        来自
        待定 1、待 2
        在哪里
        tb1.booking_ref = tb2.booking_ref

        tb1.investor = tb2.investor(+) 和
        tb1.investor = ''12345''

        (我认为是对的……无法验证)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-08-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多