我有一个看似直截了当的问题。我将id列表与第二个表中的另一个id列表进行匹配。以下查询执行正常并返回结果:
select * from dataTable where id = 3888;
select * from moreIDs where mmid = 3888;
但是,join语句不会返回任何结果。
select * from dataTable inner join moreIDs on dataTable.id = moreIDs.mmID;
我知道为什么我没有从加入中获得任何结果?
答案 0 :(得分:2)
正如您在评论中所知,您的问题与数据类型有关。
以下小提琴显示了一些测试:fiddle。
首先,我创建了三个表格如下:
CREATE TABLE table1 (id varchar(15));
CREATE TABLE table2 (id varchar(15));
CREATE TABLE table3 (id int);
并插入了一些数据:
INSERT INTO table1 values ('3888');
INSERT INTO table2 values (' 3888 '); -- extra spaces
INSERT INTO table3 values (3888);
如果您查询varchar
列,将其与int
值进行比较,则varchar
将被隐含地强制转换为int
,并且将删除额外的空格。以下示例返回3888
:
SELECT * FROM table1 WHERE id = 3888;
SELECT * FROM table2 WHERE id = 3888;
但是,如果您在JOIN
操作中尝试此匹配,则会将varchar
与varchar
进行比较,因此'3888' = ' 3888 '
将被评估为false。
要解决此问题,您可以将其中一列转换为int
(因此将使用强制转换)或使用TRIM()
函数,例如:
SELECT *
FROM table1
INNER JOIN table2
ON TRIM(table1.id) = TRIM(table2.id);
注意:如果可能,请将两个列转换为int
以获得SARGABLE查询。如果使用索引,每行中的强制转换操作(varchar
到int
)都会对性能产生影响。