T-SQL:如何以不同的方式加入每一行

问题描述 投票:0回答:2

如何将具有不同字段且需要不同规则的两个表联接在一起?一个例子:

tb_references               tb_parts
==================          ====================
f_type  |  f_item           f_partID  |  f_partnumber
------------------          --------------------
YY      |  ABC123           1         |  YYABC123
YY      |  ABC124           2         |  YYABC124
NN      |  000111           3         |  YY000111
NN      |  000112           4         |  YY000112

要加入这些,我通常会执行如下查询

SELECT * 
FROM tb_references
JOIN tb_parts
ON f_type + f_item = f_partnumber

但是,您会看到f_typeNN不匹配,所以我的结果将如下所示:

RESULTS
=============================================
f_type  | f_item  | f_partID  | f_partnumber
---------------------------------------------
YY      | ABC123  | 1         | YYABC123
YY      | ABC124  | 2         | YYABC124

如何在查询中指定IF语句以使我也匹配损坏的NN部分?

有点像这种逻辑,但是尽管尝试了各种方法但没有成功,但我不知道如何实现它:

SELECT * 
FROM tb_references
JOIN tb_parts
ON 
 IF (
    f_type = 'NN' THEN
      'YY' + f_item = f_partnumber
    )
 ELSE (
    f_type + f_item = f_partnumber
 )

那么,我的最佳结果将是这样:

RESULTS
=============================================
f_type  | f_item  | f_partID  | f_partnumber
---------------------------------------------
YY      | ABC123  | 1         | YYABC123
YY      | ABC124  | 2         | YYABC124
NN      | 000111  | 3         | YY000111
NN      | 000112  | 4         | YY000112

当然,我对在JOIN中未使用IF的其他解决方案持开放态度-这只是我尝试描述我所面临问题的方式。不幸的是,我不能简单地更新“ f_type”字段,因为它是我们无法控制或编辑的第三方数据库。

sql-server tsql
2个回答
0
投票

您可以使用CASE语句。不过,这可能是止痛的明智之举:

SELECT * 
FROM tb_references
JOIN tb_parts
ON CASE WHEN f_type='yy' THEN 'zz' ELSE f_type END  + f_item = f_partnumber

0
投票

如果f_partnumber的前缀始终为2,则可以在连接中将它们替换为空字符。

© www.soinside.com 2019 - 2024. All rights reserved.