我有两个与外键无关的表。 TABLE_A CODE列类型为nvarchar(10),TABLE_B CODE列类型为nvarchar(2),CodeID列类型为bigint。 Table_B包含超过3百万行,我将只提供一些简短的样本:
TABLE_A
CodeId | CODE
11 | DS
12 | TR
13 | MP
14 | KD
15 | 2A
16 | AC
...
TABLE_B
ID | CODE
1 | DS
2 | DS
3 | DS
4 | TR
5 | TR
6 | MP
7 | KD
8 | KD
9 | 2A
10 | AC
11 | AC
...
我想从TABLE_B中获取TABLE_B相关CodeId的每个CODE的结果集,所需的输出:
RESULT SET
ID | CODE | CODEID
1 | DS | 11
2 | DS | 11
3 | DS | 11
4 | TR | 12
5 | TR | 12
...
我试过左连接表
Select * FROM TABLE_B AS B
left JOIN TABLE A AS A on A.CODE=B.CODE
但是对于某些代码值,例如2A,AC,它在结果集的CodeId列中返回Null,尽管两个表中都存在匹配。
更新 我刚刚执行了查询
SELECT * FROM TABLE_A where CODE in ('2A', 'AC')
我的输出没有任何结果。 但执行后
SELECT CODE FROM TABLE_A
我在CODE列中有2A和AC值的行。
答案 0 :(得分:0)
正常的连接查询可以满足您的需求。试试这个:
select t2.id, t2.code, t2.date, t1.codeID
from table_B t2 join table_A t1 on (t2.code = t1.code)
您可以在此处看到SQLFiddle Demo。
答案 1 :(得分:-1)
我发现CODE列中的一些varchar数据有换行符 通过执行此查询:
SELECT CODE FROM TABLE_A WHERE CODE LIKE '%' + CHAR(10) + '%'
这就是LEFT JOIN返回NULL的原因 - 查询无法找到匹配项 为了解决这个问题,我替换了所有换行符和回车符:
SELECT REPLACE (REPLACE(CODE,char(10),''),char(13),'')
Shannon Severance的评论帮助我找到了解决方案。