我正在分析一个相当可怕的遗留数据库/代码库,尝试通过将查询组合到连接中来减少服务器负载(包括通常调用超过一百万个单独查询的电子邮件警报cron作业).
SELECT * FROM
class_alerts_holding ah
INNER JOIN class_listings l ON l.id = ah.lid
INNER JOIN class_users u ON u.id = ah.uid
LEFT JOIN class_prodimages pi ON pi.pid = ah.lid
Run Code Online (Sandbox Code Playgroud)
吐出120列......
aid | id | lid | uid | oid | catName | searchtext | alertfreq | listType | id | owner | title | section | shortDescription | description | featured | price | display | hitcount | dateadded | expiration | url | notified | searchcount | repliedcount …Run Code Online (Sandbox Code Playgroud) 为什么使用'*'构建视图不好?
假设您有一个复杂的连接,并且可以在某处使用所有字段.
然后你只需要选择所需的字段.
SELECT field1, field2 FROM aview WHERE ...
Run Code Online (Sandbox Code Playgroud)
视图"aview"可能是 SELECT table1.*, table2.* ... FROM table1 INNER JOIN table2 ...
如果table1和table2中的2个字段具有相同的名称,则会出现问题.
这只是为什么在视图中使用'*'不好的原因?
使用'*',您可以在不同的上下文中使用该视图,因为信息就在那里.
我错过了什么?
问候
是否可以在选择中使用前缀对所有列进行别名?我在Oracle数据库中有一组表需要连接在一起,并且大多数表具有相同的列名.我想有类似的东西
select MAGIC_ADD_PREFIX("PREFIX", *) from TABLE
Run Code Online (Sandbox Code Playgroud)
并有一个结果
+---------+----------+----------+
|PREFIX_ID|PREFIX_FOO|PREFIX_BAR|
+---------+----------+----------+
|... | | |
Run Code Online (Sandbox Code Playgroud)
ATM我唯一能想到的就像chumsky一样
select ID PREFIX_ID, FOO PREFIX_FOO, BAR PREFIX_BAR from TABLE
Run Code Online (Sandbox Code Playgroud)
但它很丑陋,因为地狱和容易出错
====进一步解释====
这个问题
select TABLE.*,...
Run Code Online (Sandbox Code Playgroud)
是我使用java + jdbc驱动程序来检索列,java.sql.ResultSet方法(resultset.getInt("COLUMNNAME"),.getString("COLUMNNAME")...)不支持语法"TABLENAME.COLUMNAME".
如果我这样做(简化,没有错误...)
ResultSet rs = mkResultSet("select * from table_a, table_b");
rs.next();
System.out.println(rs.getInt("table_a.id"));
Run Code Online (Sandbox Code Playgroud)
我得到一个SQLException无效的列名作为消息