未知专栏' ..'在'字段列表'加入

时间:2017-02-06 16:16:23

标签: mysql delimiter outer-join

我用连接做了一个简单的查询,但总是得到这个恼人的错误。
查询:

SELECT 
    `verk.id`, `verk.date`, `verk.quant`, `verk.verid`, `verk.kunde`, `verk.gebracht`, `loginuser_aqa.name`, `loginuser_aqa.id`
FROM 
    `verk` 
FULL JOIN 
    `loginuser_aqa`
ON
    loginuser_aqa.id = verk.verid
WHERE
    verk.gebracht = 0
ORDER BY  verk.date;



错误:

  

未知栏' verk.id'在'字段列表'


在rextester上提供了一个演示:
http://rextester.com/HDTJAA39589

我已经尝试离开" verk"从verk.id开始,但我又得到了另一个错误:

  

id不明确..

2 个答案:

答案 0 :(得分:3)

此查询中至少有两个问题。

首先,当您使用反向标记来分隔标识符时,必须将表别名与列名称分开。

`verk.id`   -- WRONG

`verk`.`id` -- CORRECT

原因是SQL实际上允许您定义包含标点符号,空格等的列名称,如果您分隔列名称。这就是你似乎正在做的事情,请求一个名为verk.id

的列
verk.id     -- ALSO CORRECT

正如其他人所评论的那样,您通常不需要使用分隔标识符。如果您的标识符与MySQL Reserved Words冲突,或者您需要使用标点符号,空格或国际字符,请使用它们。

第二个问题是MySQL不支持FULL JOIN。它甚至不将FULL识别为SQL关键字。所以你的查询形成如下:

...
FROM 
    `verk` 
FULL JOIN 
    `loginuser_aqa`
ON ...

由MySQL解释,就好像你已经这样做了:

...
FROM 
    `verk` AS `FULL`
JOIN 
    `loginuser_aqa`
ON ...

换句话说,由于AS是SQL中的可选关键字,因此您只需将FULL设置为verk的表别名。

定义表别名时,必须使用属于该表的任何列的表别名。您无法再将列引用为verk.id,您必须使用FULL.id。这部分是标准的SQL行为,而不是MySQL错误。

这样做的另一个问题是,您的查询结果中没有FULL OUTER JOIN,您只是得到JOIN这是INNER JOIN的同义词。没有错误,但是如果你需要一个完整的外部联接,你将无法得到你期望的结果。

我在2013年报告了MySQL不支持FULL作为保留字的问题:https://bugs.mysql.com/bug.php?id=69858如果您想要登录并单击“影响”,您可以将您的投票添加到错误的优先级那个页面上的“按钮。”

如果您需要在MySQL中执行FULL OUTER JOIN,则必须使用变通方法。请参阅此处的示例:Full Outer Join in MySQL

答案 1 :(得分:2)

你把整个东西放在反叛中。

而不是:

`table.col`

使用

`table`.`col`

此外,MySQL没有FULL JOIN。请使用FULL JOIN检查您想要达到的目标。有模拟它的技术。

试试这个:

SELECT 
    v.`id`, v.`date`, v.`quant`, v.`verid`, v.`kunde`, v.`gebracht`, a.`name`, a.`id`
FROM 
    `verk` v
LEFT JOIN 
    `loginuser_aqa` a
ON
    a.`id` = v.`verid`
WHERE
    v.`gebracht` = 0
ORDER BY  v.`date`;