【发布时间】:2015-03-01 23:03:46
【问题描述】:
我的 MySQL 视图有问题。
TL;DR: *如果我像普通查询一样运行下面的查询:正确的结果会通过左右连接发回;
但是,如果我将它们用作视图 (create view as ...) SQL server 正在改变单词本身。*
当我创建一个没有联合的视图时 - 它工作正常。但是... MySQL 不支持 FULL OUTER JOIN,所以我必须用 union 连接左右连接才能得到我的结果。
现在,当我使用联合创建或编辑视图时,我必须删除“as”之后和查询末尾的括号,因为它不能以其他方式工作。
现在,主要问题。也许举个例子:
select * from y LEFT join x on [..]
UNION
select * from y RIGHT join x on [...]
如您所见,它仅在单词上有所不同:LEFT 和 RIGHT。
[edit] 我可以将第一个“左”更改为“右”,它也会被替换..
当我接受并发送此查询时,没有任何错误或警告。
但是,视图没有显示正确的结果,所以现在我检查视图。我用 sqlyog 打开它(改变),看看有什么问题,什么? 它看起来像这样:
select * from y LEFT join x on [..]
UNION select * from y LEFT join x on [...]
你看到了吗? “右”字已替换为“左”。 [是的,联合后的输入跳过了自己] 因为结果不正确,sqlyog本身不会改变它,mysql服务器正在这样做。
为什么?是我的错吗?
另外,如果我想添加“OUTER”这个词,它会被跳过。重新打开后,“右”字被替换,“外”字被删除。
现在我将尝试通过创建 2 个视图来克服它,一个具有右连接,一个具有左连接并将它们连接到第三个视图中...但是视图不使用索引,因此性能会很糟糕...
【问题讨论】:
-
发回的“不正确的结果”是什么?您希望寄回什么?你的文字查询是什么?在您的视图中更改的 sql 应该不是问题,它总是在视图创建时发生,但是生成的 sql 应该是等效的,即使某些单词发生了变化.
-
join关键字前没有逗号。每当我在from子句中看到逗号时,我都会怀疑。如果你的真实代码有这个,逗号可能会导致意外行为。 -
@GordonLinoff:对不起,我的原始查询中没有昏迷。它只是很大,我的“心理捷径”在问题中添加了它们。 ;) 我会纠正它。
-
@Kritner:它们非常大,可能是整个问题的 3/4,所以我不想让你的信息过多。我在查询中连接了 4 个表:A、B、C、D。表 A 有:guid_one、guid_two、ID、时间戳。表B:guid_one、other_data;表 C:ID、id_data,表 D:guid_two、two_name。我必须将它们连接起来才能拥有所有这些东西。我实际上是将此查询作为普通查询发送并且它可以工作(选择结果是正确的),但是如果我将此查询设置为视图(将视图创建为选择..) - 服务器会更改它并且在选择时我有不正确的数据视图。
-
我们看不到查询。但是,如果您确定查询在直接运行而不是在视图中运行时返回 不同 结果(并记住结果集的顺序可能不一样),那么您可能会偶然发现MySQL 中的错误。以下是有关如何处理潜在错误的文档:dev.mysql.com/doc/refman/5.7/en/bug-reports.html.