SQL版本的VLOOKUP

8

我是SQL的新手,如果您有空的时间,我想知道是否有人能帮助我在SQL中复制Excel的Vlookup函数?

经过一些研究,我认为我需要使用其中一个join函数,但是,我不想仅选择包含在两个表中的数据——我只想查找1个表中的值对应另一个表中的值。

如果数据包含在查找表中,则返回该值;如果没有,则返回NULL

我在下面给出了几个示例表格,以帮助说明我的问题。

请注意:产品'C'和'D'不在Table2中,但它们仍然在结果表格中,但值为NULL。

另外,我有大量唯一的产品,所以我不会寻找包含硬编码的答案,例如:CASE WHEN [Product] = 'A' THEN...



TABLE1

Product    Quantity
-------------------
A          10
B          41
D          2
C          5
B          16
A          19
C          17
A          21

表格2

Product    Cost
-----------------
A          £31.45
B          £97.23



结果表格

Product   Quantity    Cost
-----------------------------
A         10          £31.45
B         41          £97.23
D         2           NULL
C         5           NULL
B         16          £97.23
A         19          £31.45
C         17          NULL
A         21          £31.45

2
你能否尝试帮我在SQL中复制Excel Vlookup函数呢?= 你肯定可以试一试吧? - Mitch Wheat
2个回答

11

看起来你需要一个外连接,在我的示例中我将使用左连接:

select t1.Product, t1.Quantity, t2.Cost
from table1 as t1
left outer join table2 as t2
    on t1.Product = t2.Product

您还可以省略外部关键字:

select t1.Product, t1.Quantity, t2.Cost
from table1 as t1
left join table2 as t2
    on t1.Product = t2.Product

1
如果你想让它正常工作,你需要添加 and t2.Product <> '' ,否则你可能会得到比你要求的更多的记录。因为如果匹配列中有重复项,连接可能会重复。 - user890332
1
@user890332,我不确定你的建议可以防止什么情况,请详细说明一下? - Lennart - Slava Ukraini
1
实际上我的编辑不够清晰。我的意思是说,如果右表中有重复行,则左外连接将不会返回左表中的确切行。如果您需要一个精确的计数(这就是我所需要的),那么您需要找到一种方法来缩小范围,以便每个连接只返回一行。 - user890332
1
使用distinct(或group by)? - Lennart - Slava Ukraini
1
提出一个新问题,没有任何细节很难说清楚。请包括创建表和插入语句以展示问题。 - Lennart - Slava Ukraini
显示剩余4条评论

1
这是Lennart的最新回答版本,非常有效。原始答案翻译成"最初的回答"。
select *
from table1 as t1
left outer join table2 as t2
    on t1.Product = t2.Product
    and t2.Product <> ''
left outer join table3 as t3
    on t1.Product = t3.Product2
    and t3.Product2 <> ''

重点是你需要排除连接表列为空的行,否则将返回比table1更多的行。真正的vlookup不会向左侧的表添加任何行。我甚至添加了第三个表来产生效果。"最初的回答"

第三个表是否必要?如果是,那么应该在其中放什么? - Tim Wilcox
如果t2.product <> '',它只能与t1.product相匹配,如果t1.product = '',那么你排除了t1.product = ''的行。这与OP提出的问题无关,当然也不是消除重复项的方法(除非t1或t2中有许多没有产品ID的行,这意味着这些表不适合关系数据库)。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接