问:我的问题是关于限制union运算符的使用的限制条件。查询里的列的名字不应该匹配吗?为什么Oracle不把这个限制用于列名字规则上?我认为,肯定有一个约束union运算符使用的限制条件,规定除了数据类型和列数外,查询相关的列的名字必须匹配。这样的限制条件可以降低编程员对不相关列使用union的可能性。 答:我的看法基本是这样的:我们应该感到庆幸,事实上union并没有这样的限制条件。
因为这会毁了一个非常有用的SQL运算符。 假设union查询里的列名字确实需要匹配,像这样: select foo, bar……
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国
问:我的问题是关于限制union运算符的使用的限制条件。查询里的列的名字不应该匹配吗?为什么Oracle不把这个限制用于列名字规则上?我认为,肯定有一个约束union运算符使用的限制条件,规定除了数据类型和列数外,查询相关的列的名字必须匹配。这样的限制条件可以降低编程员对不相关列使用union的可能性。
答:我的看法基本是这样的:我们应该感到庆幸,事实上union并没有这样的限制条件。因为这会毁了一个非常有用的SQL运算符。
假设union查询里的列名字确实需要匹配,像这样:
select foo, bar, qux, fap from HERE where this = 9 union select foo, bar, qux, fap from THERE where that = 37 |
这样的查询有什么作用?很明显,如果HERE跟THERE一样,我们就根本不需要union,只要在THIS和THAT上使用OR就可以了。
所以HERE和THERE是不同的来源。但是它们真正的区别到底在哪里?如果存在那样的限制条件,这些来源则必须拥有一样的列!这当然意味着它们有相似的数据。我们要注意不同的来源拥有相似的数据有时候是个建模不完整或不完善的警示。
所以,如果有限制条件,我们能够写的现实世界的union查询的数目就会非常有限。
这样我们就不能写出如下这样有用的查询:
select regno as security , ’stock’ as type , currvalue as asset_amt from STOCKS where custno = 42 union all select bond_id , ’bond’ , npv from BONDS where ownerid = 187 order by asset_amt desc |
至于说要防止编程员执行不相关的union,也许我们应该鼓励他们这样做。要分别运行STOCKS和BONDS查询需要许多额外的程序设计(如果union限制你必须使用相同的列名,你就不得不分别运行这两个查询),而且仍然会按照顺序显示查询结果。
编程员应该去寻找编起来更简单、运行起来更有效的SQL方案。
相关推荐
-
组合多个SQL Server查询的结果集
SQL Server可以组合多个查询到一个语句中,以产生单个结果集。为了将查询连接在一起,我们可以使用UNION、INTERSECT或EXCEPT操作符。
-
如何在Oracle中使用UNION操作
在Oracle中,怎样使用UNION操作将两个不同的表连接起来,并让它们拥有相同的列数量和列名,专家将给出答案。