MySQL在视图中更改了联合内容

时间:2015-03-01 23:03:46

标签: mysql join union

我的MySQL视图有问题。

  

TL; DR:   *如果我按正常查询运行查询:使用左右连接发回适当的结果;

     

但是,如果我将它们用作视图   (创建视图为...)SQL服务器本身正在改变单词。*

当我创建一个没有联合的视图时 - 它工作正常。但是...... MySQL不支持FULL OUTER JOIN,因此我必须使用union连接左右连接以获得我的结果。

现在,当我使用union创建或编辑视图时,我必须在“as”之后和查询结束时删除paranthesis,因为它不能以其他方式工作。

现在,主要问题。也许就是一个例子:

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'字样,它就会被跳过。重新打开后,“right”一词被替换,“outer”被删除。

现在我将尝试通过创建2个视图来克服它,一个用右边,一个用左边连接,在第三个视图中加入它们......但是视图不使用索引,所以性能会很糟糕......

3 个答案:

答案 0 :(得分:0)

leftright联接之间没有区别,除了已经切换了联接的“基本”表这一事实。

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加入,则会隐含{{1}}。

您将不得不提供有关结果“不正确”的更多信息,因为您没有提供足够的信息来表明您的期望,获得的内容以及您认为错误的原因。

答案 1 :(得分:0)

我建议您对结果集中所需的列进行顽固明确的说明。而不是使用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

编写查询更难,但您可以避免结果集的列命名中存在一些歧义。这种模棱两可可能会搞得一团糟。

答案 2 :(得分:0)

我找到了解决方案:

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

如果您使用view并在group by的查询中使用view,则其工作方式与仅在group by中设置view和然后在没有view的情况下向此group by发送查询。

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

案件结案。