【问题标题】:MySQL changes things in union in a viewMySQL 在视图中更改了 union 中的内容
【发布时间】: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.

标签: mysql join union


【解决方案1】:

我建议你对你想要在结果集中的列进行明确和明确的处理。不要使用SELECT *,而是枚举列。并且,请确保以某种方式使用别名列名称,以免最终没有重复名称。例如。

SELECT a.id, a.thisval, a.thatval,
       b.id AS bid, 
       b.thisval AS bthisval,
       b.thatval AS bthatval,
       b.the_otherval
  FROM y AS a
  LEFT JOIN x AS b ON a.id = b.id
 UNION
SELECT a.id, a.thisval, a.thatval, 
       b.id AS bid, 
       b.thisval AS bthisval,
       b.thatval AS bthatval,
       b.the_otherval
  FROM y AS a
 RIGHT JOIN x AS b ON a.id = b.id

编写查询比较困难,但可以避免结果集的列命名出现歧义。这种模棱两可会造成混乱。

【讨论】:

  • 我喜欢这个,但我仍然没有看到右连接的意义,当(在我看来)左连接更直观
  • @Strawberry,毫无疑问。但我只是想以与提出问题相同的方式回答 Acrivec 的问题。另外,这是一个 wiki 答案,所以请继续编辑它!
【解决方案2】:

我找到了解决办法:

view 中使用group by 的工作方式与在普通查询中不同。

如果您使用 view 并在查询中使用 group by 到该 view 它将与仅在 view 中设置 group by 然后向该 view 发送查询不同group by

它应该像这样工作吗?真不知道。也许我刚刚破坏了 MySQL。

结案。

【讨论】:

    【解决方案3】:

    leftright join 没有区别,除了 join 的“base”表已经切换。

    select * 
    from table1 
    left join table2 on table1.id = table2.id
    

    等价于

    select * 
    from table2 
    right join table1 on table1.id = table2.id
    

    这是一个 SQLFiddle,展示了 leftright 连接的相似之处: http://sqlfiddle.com/#!2/ceac6f/5

    outer 不是inner 连接时,它隐含在连接中。

    您将不得不提供更多信息来说明导致结果“不正确”的原因,因为您没有提供足够的信息来说明您的期望、得到的结果以及您认为错误的原因。

    【讨论】:

    • 嗯,我想说有很大的不同。表A:a、b、c 表B:b、c、d 现在,左外连接结果:a - null; b - b; c - c;右外连接:b - b; c - c;空 - d;最后,union 不支持但模拟,full outer join: a - null; b - b; c - c;空 - d;你知道我的意思。 ;) 我需要所有结果。
    • 此外,如果我像普通查询一样运行这些查询,而不是通过将它们创建为视图,它们正在工作。正确的结果被发回。左连接和右连接在联合中执行和添加。但是,如果我将此查询用作视图,它们会如前所述被“更改”。
    • @Strawberry 啊,对不起,我在复制/粘贴时错过了这个。得到 col=col 但没有表格转置
    • col=col 位(在功能上)无关紧要!
    • @Strawberry 哦哇看看这里我一直认为它确实有所作为......谢谢!我想我不会写正确的连接查询来真正玩弄它们 - 我认为 col = col 的顺序直到现在有所不同:)
    猜你喜欢
    • 2021-03-31
    • 1970-01-01
    • 2015-10-08
    • 2022-11-30
    • 1970-01-01
    • 2023-03-20
    • 2017-02-17
    • 1970-01-01
    • 2013-04-26
    相关资源
    最近更新 更多