表中匹配的数据时,Join返回NULL

时间:2018-08-22 08:12:47

标签: mysql sql join mariadb

当两个表具有相同的机器编号并且两个表中具有相同编号的条目时,我试图获取结果。
这是我尝试过的:

SELECT fehler.*,
  'maschine.Maschinen-Typ',
  maschine.Auftragsnummer,
  maschine.Kunde,
  maschine.Liefertermin_Soll 
FROM fehler 
JOIN maschine 
  ON ltrim(rtrim('maschine.Maschinen-Nr')) = ltrim(rtrim(fehler.Maschinen_Nr))

在两种情况下,我要加入的字段均为varchar。我尝试不修剪但仍然返回空
我正在使用MariaDB(如果很重要)。

3 个答案:

答案 0 :(得分:3)

打开ltrim(rtrim('maschine.Maschinen-Nr'))= ltrim(rtrim(fehler.Maschinen_Nr))似乎是错误的...

fehler.Maschinen_Nr真的是字符串'maschine.Maschinen-Nr'吗?

SELECT fehler.*, `maschine.Maschinen-Typ`, maschine.Auftragsnummer, maschine.Kunde, maschine.Liefertermin_Soll 
FROM fehler 
JOIN maschine 
ON ltrim(rtrim(`maschine.Maschinen-Nr`)) = ltrim(rtrim(`fehler.Maschinen_Nr`))

最后一行将字符串与数字进行了比较。这应该这样做。 另外,使用反引号引用列名。

答案 1 :(得分:2)

单引号是字符串定界符。您正在将fehler.Maschinen_Nr与字符串'maschine.Maschinen-Nr'进行比较。在标准SQL中,您应该在名称中使用双引号(而且我认为MariaDB也允许使用此设置,提供某些设置)。在MariaDB中,常用的名称限定词是反引号:

SELECT fehler.*,
  `maschine.Maschinen-Typ`,
  maschine.Auftragsnummer,
  maschine.Kunde,
  maschine.Liefertermin_Soll 
FROM fehler 
JOIN maschine 
  ON trim(`maschine.Maschinen-Nr`) = trim(fehler.Maschinen_Nr)

(当然最好不要使用带有减号的名称或其他迫使您首先使用名称分隔符的字符。)

如您所见,可以使用TRIM代替LTRIMRTRIM。不过,插入数据时最好不要在开头或结尾留有空间。这样,您就不必在每个查询中都将其删除。

此外,似乎Maschinen_Nr应该是表maschine的主键,并且自然是表fehler中的外键。这样可以确保fehler不包含Maschinen_Nr中不存在的任何maschine

答案 2 :(得分:0)

为避免将来出现此问题,DB的约定为蛇形(lowercase_lowercase)。

除此之外,由于我不猜测您的数据结构,因此发布数据库架构将非常有帮助。

(对于友好的开发,变量,表和列应该用英语编写很有用)

因此,您得到的错误是什么,因为如果表“ maschine”具有名为“ Maschinen-Nr”的列,而表“ fehler”具有名为“ Maschinen_Nr”的列且各字段彼此匹配,则错误应该是正确的

请谨慎使用Maschinen-Nr和Maschinen_Nr。他们有-和_故意?

一个非常盲目的解决方案,因为您没有真正说出问题所在,甚至您的架构是:

SELECT table1Alias.*, table2Alias.column_name, table2Alias.column_name
FROM table1 [table1Alias] 
JOIN table2 [table2Alias]
ON ltrim(rtrim(table1Alias.matching_column)) = ltrim(rtrim(table2Alias.matching_column))

其中matching_columns分别为PK和FK,或者如果数据与两列匹配都为[]是可选的,并且如果未给出,将考虑为table_name