子查询和MariaDB上的UNION问题 - 这是一个错误吗?

时间:2016-08-22 05:17:08

标签: mysql database union mariadb

我有兴趣确定我在MariaDB中遇到的这种奇怪行为是否是一个错误:

我创建了一个视图,包含以下代码,其中UNIONs包含两个包含相似数据的表的输出。每个表包含多年,state_incometax_deductions包含多年的多个状态的数据。该视图的目标是获取每个州可用的最新数据行:

(
    SELECT "Federal" AS StateName, 
        Year,Data1,Data2
    FROM federal_incometax_deductions
    WHERE ( Year = (SELECT Max(Year) FROM federal_incometax_deductions) )
)
UNION
(
    SELECT  StateName,Year,Data1,Data2
    FROM state_incometax_deductions x
    WHERE Year = (
      SELECT Max(Year) 
      FROM state_incometax_deductions 
      WHERE StateName=x.StateName # <-- This is the important part
    )
    ORDER BY StateName DESC
);

当我在我的开发服务器上运行时,此代码成功地为每个州提供了可用的最新数据行(MySQL Ver 14.14 Distrib 5.6.17)。

但是,当我在生产(mysql Ver 15.1 Distrib 5.5.47-MariaDB)上运行时,我始终只获得表1(federal_incometax_deductions)的结果,而不是表2中的结果。

运行时,我也会收到一些警告,这些警告似乎与我的查询无关:Incorrect datetime value: '2016'。如果我切换到UNION ALL,这些警告会消失,但查询仍然不会返回预期的数据。

当我在UNION之外运行第二个查询时,它可以工作。当我从联盟内部删除WHERE StateName=x.StateName时,它也开始工作。这意味着该问题是由引用正在查询的表的别名的WHERE引起的。

我终于发现,我可以通过将Year =替换为Year IN来实现此功能,https://{mycompany}.attasksandbox.com/attask/api/project?ID=57ba84---1&updates={"description":"ToImplementWorkFront","URL":"T:%5CTechnologyWorkRequests%5C2016%5CTAD160888_Communications"}&apiKey=g--t&method=put由于某种原因正常工作并返回预期结果。

我找不到任何有关此行为的解释,但似乎MariaDB对我正在运行的版本中对UNION的处理做了一些更改。

这是MariaDB中的错误吗?

0 个答案:

没有答案