我认为要理解我需要阅读的标题并不容易,所以我会更好地解释。 我的数据库就像:
表1 表2 表3 和其他类似的表......
用户将在文本字段中插入1
之类的值,我只会向其显示包含1
的名称。我是这样做的:
ArrayList<String> found = new ArrayList<String>();
ArrayList<String> allTable = getAllTableInDB();
for(String table:allTable){
try {
ResultSet rs = stat.executeQuery("SELECT * FROM '"+table+"'");
while(rs.next()){
if(!found.contains(rs.getString("name")) && rs.getString("name").equals(WhatUserInserts))
found.add(rs.getString("name"));
}
} catch (SQLException ex) {
ex.printStackTrace();
Logger.getLogger(DB.class.getName()).log(Level.SEVERE, null, ex);
}
}
我现在要做的是计算此名称的“最佳”,按列v的平均值排序。
对于一张桌子,我知道我可以使用类似的东西:
SELECT name FROM table GROUP BY name ORDER BY AVG(v) DESC
如何在某些表的这个限制值上做同样的事情?
我希望我能很好地解释我的问题
以这种方式解决了感谢Dan P
:
ArrayList<String> tables = getAllTableInDB();
String query = "SELECT * FROM (";
String union = " UNION ";
for(int i=0;i<tables.size();i++){
query+="SELECT * FROM '"+tables.get(i)+"' WHERE name LIKE '%"+find+"%'";
query = i==tables.size()-1?query:query+union;
}
query+=") GROUP BY nome ORDER BY AVG(venduti) DESC";
答案 0 :(得分:2)
假设您想要所有表的Max或Avg,这将获得name的最大V值。如果你想要Avgerage使用AVG。我并不完全理解这个问题,但我认为这就是你想要的。
SELECT Name, Max(V)
FROM
(
SELECT Name, v
FROM TABLE1
UNION
SELECT Name, v
FROM TABLE2
UNION
SELECT Name, v
FROM TABLE3
) AS AllTables
GROUP BY Name
WHERE Name = 'Jon Doe'
评论后,您询问是否可以提高效果。是的,假设名称上有索引/主键,将名称包含在每个表的where子句中。如果你走这条路,你应该使用一个表值函数。
DECLARE @Name NVARCHAR(50)
SET @Name = 'Jon Doe'
SELECT Name, Max(V)
FROM
(
SELECT Name, v
FROM TABLE1
WHERE Name = @Name
UNION
SELECT Name, v
FROM TABLE2
WHERE Name = @Name
UNION
SELECT Name, v
FROM TABLE3
WHERE Name = @Name
) AS AllTables
GROUP BY Name