如何选择所有 (*) 但又不出现 "每个视图中的列名必须唯一" 的错误提示。
如何选择所有 (*) 但又不出现 "每个视图中的列名必须唯一" 的错误提示。
我需要封装一个我们经常在供应商的数据库服务器上使用的一组表连接。我们在提取等许多地方都重复使用相同的连接逻辑,使用视图似乎可以在一个地方定义和维护这些连接。
问题在于供应商定期对数据库进行更改(添加列、更改名称),我希望这些更改能够自动反映在“MasterView”中。
SELECT *可以实现这一点,但是底层表都有ID列,所以会出现“每个视图中的列名必须唯一”的错误。
我特别希望避免列出来自表的列名,因为:a)这需要频繁维护 b)每个表有几百个列。
有没有办法实现SELECT *的动态性,但有效地排除某些列(即ID列)?
谢谢
SELECT * 查询语句可以用来检索表中的所有列,但是有时候会遇到 "Column names must be unique in each view" 的错误提示。这个问题的出现原因是在查询结果中存在重复的列名。
为了解决这个问题,我们可以使用以下方法:
一种简单的方法是使用信息模式视图(information_schema.columns)来生成所需的列名。在这个方法中,我们可以通过查询信息模式视图,根据表名和需要排除的列名来生成所需的列名。
具体的解决方法如下:
SELECT column_name+','
FROM information_schema.columns
WHERE table_name = 'tt'
AND column_name NOT IN ('ID')
在该解决方法中,我们使用了信息模式视图(information_schema.columns)来获取表 'tt' 中的所有列名。同时,我们通过添加条件来排除名为 'ID' 的列名。通过执行这个查询语句,我们可以得到一个以逗号分隔的列名列表。
通过这种方法,我们可以获取所需的列名,而避免了 "Column names must be unique in each view" 的错误提示。这样我们就可以顺利执行 SELECT * 查询语句,获取所有列的查询结果了。
感谢以上的提供的方法,我正在尝试使用这个方法进行一些实验。
问题的原因是,作者希望避免在查询中列出表的列名,因为这需要频繁的维护,并且每个表有几百个列。然而,这种情况下不能避免指定列名,对于那些具有重复名称的列,可以使用别名来解决。代码生成可以帮助处理这些多个列。
解决方法是使用别名来指定重复名称的列。此外,需要注意的是,使用SELECT *
是不好的做法,因为如果有人向其中一个表添加一个2GB的二进制列并填充它,你真的希望将其返回吗?
虽然我完全同意最好遵循最佳实践,但是在维护性的好处超过可能产生的大量不需要的数据的情况下,我认为维护性的好处更重要(考虑到所涉及的数据类型,这种情况很少发生)。
然而,如果列发生更改,维护性实际上是没有意义的。请查看我的答案。