我有兴趣确定我在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中的错误吗?