【问题标题】:Join returns NULL when data that matches is in the table当匹配的数据在表中时,Join 返回 NULL
【发布时间】:2018-08-22 08:12:46
【问题描述】:

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

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

【问题讨论】:

  • 哦,我也尝试过内部连接,因为这基本上就是我想要做的。只有当 mashine 编号在两个表中时才能得到结果
  • 两列的大小写是否相同(大写/小写)?
  • 添加一些样本表数据,当前结果和想要的结果。全部为格式化文本,而不是图像。
  • 您使用的是哪个 dbms?
  • @Jens 为什么你把'maschine.Maschinen-Nr' 作为一个字符串,不应该没有撇号吗?

标签: mysql sql join mariadb


【解决方案1】:

ON ltrim(rtrim('maschine.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`))

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

【讨论】:

  • 哦,我认为那是我做错了。我使用 ' 来掩盖它,因为当我没有总是显示“未知表字段 maschine.Maschinen”时,所以它缺少 -Nr。我想它不喜欢 - 在那种情况下做这件事的正确方法是什么?
  • 你可以把 `arround the maschine.Maschine-Nr 这样写成 `maschine.Maschine-Nr` !!!那些不是正常的引号!!!
【解决方案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 不包含任何在maschine 中不完全存在的Maschinen_Nr

【讨论】:

  • 好的,我试过了,但我在字段列表中收到错误 unknow tablefield 'maschine.Maschine-Typ'。但是当我查看我的表格机器的结构时,我看到了这个字段:5 Maschinen-Typ varchar(255) latin1_swedish_ci Ja NULL
  • 这很奇怪。可以换桌子吗?然后让这个maschinen_typ(和maschinen_nr)安全起见。
  • 我就是这么做的。将减号更改为下划线,现在连接有效。多谢。我想在我犯更多类似的愚蠢错误之前我还有更多的阅读要做。谢谢!
【解决方案3】:

为了避免以后出现这个问题,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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-24
    • 1970-01-01
    • 1970-01-01
    • 2017-04-12
    • 2014-02-14
    • 2016-05-17
    • 1970-01-01
    相关资源
    最近更新 更多