【问题标题】:SQL Select, Match one column but not anotherSQL Select,匹配一列但不匹配另一列
【发布时间】:2011-04-01 08:42:22
【问题描述】:

我在 SQL Server 2008 R2 数据库中有两个表,我们称它们为 A 和 B。它们看起来像这样

A
--------------------
GUID     Primary Key
B_GUID   Foreign Key
Value    nvarchar(50)

B
--------------------
GUID     Primary Key
Value    nvarchar(50)

我想从 A where 中选择所有行

  • A 中的 B_GUID 与 B 中的 GUID 匹配
  • A 中的值与 B 中的 Value 不匹配

但是,我无法弄清楚 SQL。有什么帮助吗? :) 谢谢

【问题讨论】:

    标签: sql sql-server sql-server-2008


    【解决方案1】:

    怎么样:

    SELECT A.*
    FROM dbo.A
    INNER JOIN dbo.B ON A.B_GUID = B.GUID
    WHERE
        A.Value <> B.Value
    

    INNER JOIN 在这两个列相等的情况下将两个表匹配在一起,并且 WHERE 子句将其进一步限制为仅适用该条件的两行。

    【讨论】:

    • +1,太棒了!我显然必须提高我的 SQL 技能 :) 不过喜欢这个网站,在发布问题 2 分钟后回答!再次感谢
    【解决方案2】:
    select 
      A.*
    from
      A
    join
      B on A.B_GUID = B.GUID and A.Value <> B.Value
    

    【讨论】:

      【解决方案3】:
      SELECT * 
      FROM A 
      LEFT JOIN B
      ON A.B_GUID = B.GUID  WHERE A.Value <> B.Value;
      

      这未经测试,但应该可以工作

      【讨论】:

      • 如果您发布代码、XML 或数据示例,在文本编辑器中突出显示这些行,然后单击编辑器上的“代码示例”按钮 ({ })工具栏以很好地格式化和语法突出显示它!如果您发布错误消息,使用块引号 (` " ` ) 正确格式化错误消息。
      • 为什么要左连接?? OP 想要在该值上相等的行 - INNER JOIN 的明确案例
      【解决方案4】:

      请注意,根据情况,上述答案可能存在缺陷:假设您有如下记录,即使由于其他不匹配的记录而存在匹配记录,您也会发现输出不匹配。

      TABLE 1     
      GUID    B_GUID  VALUE
      101 201 X
      102 201 Y
      
      TABLE2      
      GUID    VALUE   
      201 Y   
      201 X   
      

      解决此问题的另一种方法是使用 EXCEPT 子句查询。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-05-13
        • 2020-11-12
        • 2021-12-12
        • 2015-06-27
        • 1970-01-01
        • 2015-02-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多