【问题标题】:SQL Server query with same functionality as Excel VLookup具有与 Excel VLookup 相同功能的 SQL Server 查询
【发布时间】:2013-05-04 13:30:45
【问题描述】:

我有 2 列数据需要相互比较 - A 列和 B 列。

A 列:

Steve
Jane
Mary
Peter
Ed
Scott
Ted

B 列:

Peter
Scott
David
Nancy
  • A 列的数据量大于 B 列。
  • 但它可能没有 B 列中的所有值。

我需要找出 B 列中的哪些值也在 A 列中。

上述示例数据的预期输出:

Peter   TRUE
Scott   TRUE
David   FALSE
Nancy   FALSE
  • 需要使用 SQL Server / T-SQL 来获取此输出。
  • A 列和 B 列是 2 个单独表格中的字段
  • 2 个表中没有其他列

感谢您的帮助!

【问题讨论】:

    标签: sql sql-server excel vlookup data-comparison


    【解决方案1】:
    select 
       b.columnb,
       case when a.columna is null then 'FALSE' else 'TRUE' end 
    
    from
       tableb b left outer join
       tablea a on b.columnb = a.columna
    

    【讨论】:

      【解决方案2】:

      左连接的问题是表 A 中可能存在重复。

      如果这是一个问题,您可以这样做:

      select b.col, (case when a.val is NULL then 'FALSE' else 'TRUE' end)
      from b left outer join
           (select distinct a.val
            from a
           ) a
           on b.col = a.val;
      

      另一种表达方式是使用相关子查询。这将所有逻辑放在select

      select b.col,
             (case when exists (select 1 from a where a.val = b.col)
                   then 'TRUE'
                   else 'FALSE'
             end)
      from b
      

      【讨论】:

      • 原始问题中没有提到这种可能性,因此它真的不值得为此量身定制答案。无论如何,您为什么假设如果原始列表包含两次提及特定名称,则输出应仅包含一次提及该名称?为什么不简单地对基本查询执行 SELECT DISTINCT(而不是使用子查询)?
      • @ExactaBox 。 . .问题是关于如何获得类似于 VLOOKUP 的功能(实际上它更像是 ISNUMBER(MATCH()))。该函数 never 重复行,SQL 等价函数也不应该。将 distinct 放在外部选择中不起作用,因为您可能在第一个表中有重复项,并且您确实希望保留这些。
      • 好的,我明白你在说什么。我假设 A 列在表 A 中,B 列在表 B 中。如果表 A 有重复项,我同意。但是您的回答是“表 B 中可能存在重复项”。我们只是混淆了源列表和正在查找的列表。
      • @ExactaBox 。 . .我确实倒着回答了这个问题。谢谢你的澄清。我想我颠倒了解决方案中的所有 a 和 b。
      • 感谢您的回答以及对重复项的思考。我曾单独考虑过这一点。第二段代码运行良好。谢谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-25
      • 1970-01-01
      • 2013-12-18
      相关资源
      最近更新 更多