我正在寻找加入两个表的左连接。一个表上的字符串描述包含另一个表的UID。我只想在描述与UID匹配时才进行左连接。我需要返回Transactions表中的所有记录。 是否可以使用IF或条件语句来连接表,否则将字段保留为空?
这是一个小提琴: http://sqlfiddle.com/#!3/aaa38/5
交易表:
posted_date person_id description
2015-11-01 2 BZ#1414 Description 1414
2015-11-01 2 Another type of transaction with spaces in it
2015-11-01 3 BZ#1313 Another description 1313
2015-11-01 3 Another_description_without_spaces
Transaction_details表:
id person_id description
1414 2 additional stuff for 1414
1313 3 additional stuff for 1313
结果应该如下:
posted_date person_id description id person_id description
2015-11-01 2 BZ#1414 Des... 1414 2 additional...
2015-11-01 2 Another typ... NULL NULL NULL
2015-11-01 3 BZ#1313 Ano... 1313 3 additional...
2015-11-01 3 Another_des... NULL NULL NULL
答案 0 :(得分:0)
像这样加入真的意味着你的Transactions表结构不好(你可以使用一个单独的列来加入Transaction_details)。
话虽如此,你仍然可以实现你想要的。您可以在描述以BZ#
开头时加入,然后加入以下内容,使用id的长度来提取数字。这比尝试在描述中找到空格更好,因为可能没有任何空格。
如果没有匹配,左连接将执行其余操作并使用空值填充tran_details中的字段。
select *
from
transactions t
left join tran_details d
on t.person_id = d.person_id
and left(t.description, 3) = 'BZ#'
and substring(t.description, 4, len(cast(d.id as nvarchar(50)))) = d.id
如果BZ#
后跟详细信息表中的ID,我假设您要加入。
答案 1 :(得分:0)
以下查询将有效,只要前3个字符是' BZ#'在Transaction.Description列中
select * from Transactions t left outer join Transaction_details td on t.person_id = td.person_id and left(t.description,3)=' BZ#'和 REPLACE(SUBSTRING(t.description,0,CHARINDEX('',t.description,0)),' BZ#','')= td.id