Mysql 当表中有匹配的数据时,Join返回NULL
当两个表具有相同的机器编号,并且两个表中的条目具有相同的编号时,我尝试获取结果。Mysql 当表中有匹配的数据时,Join返回NULL,mysql,sql,join,mariadb,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(
以下是我尝试过的:
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(如果这很重要的话)。关于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`))
最后一行比较了字符串和数字。这应该可以做到。
另外,使用反勾号引用列名。关于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`))
最后一行比较了字符串和数字。这应该可以做到。
另外,使用反勾号引用列名。单引号是字符串分隔符。您正在将
fehler.Maschinen\u 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\u Nr
应该是表maschine
的主键,然后自然是表fehler
中的外键。这将确保fehler
不包含任何不完全存在的Maschinen\u Nr
,因此在maschine
中,单引号是字符串分隔符。您正在将fehler.Maschinen\u 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\u Nr
应该是表maschine
的主键,然后自然是表fehler
中的外键。这将确保fehler
不包含任何Maschinen\u Nr
中不存在的Maschinen\u Nr
,为了避免将来出现这种问题,DB的约定是snake case(小写)
除此之外,发布您的DB模式将非常有用,因为我猜不出您的数据结构
(对于友好的开发,变量、表格和列应使用英语编写是很有用的)
因此,您得到的错误是什么,因为如果表“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))
其中匹配的列分别为PK和FK,或者如果数据匹配两列[]是可选的,如果没有给出,将考虑Table名称N/P>P>以避免将来出现这种问题,DB的约定是Snake情况(LoeCaseLeLoeCase.)/P> 除此之外,发布您的DB模式将非常有用,因为我猜不出您的数据结构
(对于友好的开发,变量、表格和列应使用英语编写是很有用的) 因此,您得到的错误是什么,因为如果表“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))
其中匹配的列分别是PK和FK,或者如果数据匹配两列[]是可选的,如果没有给出,将考虑Table名称N/P > OH,并且我也尝试了内部连接,因为这本质上是我所要做的。仅当mashine编号在两个表中时获取结果两列是否大小写相同(上/下)?添加一些示例表数据、当前结果和所需结果。都是格式化文本,而不是图像。您使用的是哪种dbms?@Jens为什么要将
'maschine.Maschinen Nr'
作为字符串,不应该没有撇号吗?哦,我还尝试了内部连接,因为这正是我要做的。仅当mashine编号在两个表中时获取结果两列是否大小写相同(上/下)?添加一些示例表数据、当前结果和所需结果。都是格式化文本,而不是图像。您使用的是哪种数据库管理系统?@Jens为什么要将'maschine.Maschinen Nr'
作为字符串,它不应该没有撇号吗?哦,我想这就是我做错的地方。我一直在用'来掩盖它,因为当我没有用它时,它总是显示“未知表字段maschine.Maschinen”,所以它缺少了-Nr。我想它不喜欢-在这种情况下,用什么方法做它?你可以在maschine.Maschinen-Nr的周围加上'这样它就可以了