如何在不使用任何主键时加入两个表?

时间:2013-05-18 19:25:38

标签: mysql sql join inner-join

我正在尝试JOIN 2个表使用不是相应主键的列的列:

SELECT *
FROM TableA A
INNER JOIN TableB B
ON A.col5 = B.col5

但即使我确定0 results中的Table A值与col5 col5中的值相匹配,上面仍然会返回Table B

我做错了什么?

2 个答案:

答案 0 :(得分:6)

您查询:

SELECT *
FROM TableA A
INNER JOIN TableB B
ON A.col5 = B.col5;

具有正确的连接语法。如果有匹配的值,那么它将返回它。 (或者,您可以从应用程序中调用它,并且应用程序代码或与数据库的连接可能存在错误,但这是另一个问题。)

某些情况下,值看起来相同但不是:

  • 两个值都是浮点数。打印出来时看起来一样。但是价值末尾的位不同。永远不要使用FLOAT进行EQUI-JOIN。
  • 一个值是数字,另一个值是字符串。其中一个值的转换会产生略微不同的值。
  • 一个值是日期/时间,另一个是字符串。其中一个值的转换会产生略微不同的值。
  • 值是字符串。他们的情况有所不同。您认为abcABC1相同,但SQL不相同。
  • 字符串末尾有空格或其他“隐藏”字符。

还有两个我能想到的原因,但在所有数据库中可能都不是这样:

  • 一个值是char和另一个varchar(或它们的宽版本)。 char末尾的隐式空格使它们不同。
  • 一个是unicode字符串,另一个是ASCII字符串。两个字符看起来相同但不是。

答案 1 :(得分:0)

您的查询是正确的,应该返回表中的匹配值。但正如你所说,最后在其他表中的值中存在不可见空间,尝试使用LTRIM和RTRIM从值中删除不可见空间。 LTRIM从字符串的开头删除空格,RTRIM从字符串的末尾删除空格。

查询将如下:

SELECT * 来自TableA A. 内部联合表B B. ON A.col5 = LTRIM(RTRIM(B.col5))

我希望它可以帮助你。