join返回null

0mkxixxg  于 2021-06-20  发布在  Mysql
关注(0)|答案(3)|浏览(341)

我试图在两个表都有相同的机器编号,并且两个表中都有相同编号的条目时得到结果。
以下是我尝试过的:

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(如果这很重要的话)。

von4xj4u

von4xj4u1#

为了避免将来出现这种问题,db的约定是snake case(小写\小写)。
除此之外,发布您的db模式将非常有用,因为我不猜您的数据结构。
(为了便于开发,变量、表和列应该用英语编写是很有用的)
因此,如果表“maschine”有一列名为“maschinen nr”,而表“fehler”有一列名为“maschinen\u nr”,并且字段相互匹配,那么会出现什么错误呢
小心maschinen nr和maschinen\u 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))

其中匹配的\u列分别是pk和fk,或者如果数据同时匹配这两列,则[]是可选的,如果未给定,则将考虑表\u名称

pgx2nnw8

pgx2nnw82#

在ltrim上(rtrim('maschine.maschinen nr'))=ltrim(rtrim(fehler.maschinen nr))似乎是错误的。。。
fehler.maschinen\u 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`))

最后一行比较了字符串和数字。应该是这样的。另外,使用反勾号引用列名。

8dtrkrch

8dtrkrch3#

单引号是字符串分隔符。你在比较 fehler.Maschinen_Nr 用绳子 'maschine.Maschinen-Nr' . 在标准sql中,您可以对名称使用双引号(我认为mariadb也允许这样做,提供了某些设置)。在mariadb中,常用的名称限定符是backtick:

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 而不是 LTRIM 以及 RTRIM . 不过,在插入数据时,最好不要在开头或结尾留有空格。这样就不必在每个查询中都删除它们。
而且,看起来 Maschinen_Nr 应该是表的主键 maschine 然后在表中使用一个外键 fehler . 那会确保 fehler 不包含任何 Maschinen_Nr 在我们的世界里并不存在 maschine .

相关问题