将一个表与数据库中的所有表进行比较

时间:2014-03-20 11:40:02

标签: sql postgresql

这是样本表数据。我的数据库由如此多的表组成。在wv1相同且rv1不同的所有表中

wv1           rv1
341.6         2.48
343.6         2.58
344.7         2.37
346.3         2.32
347.9         2.29
349.5         2.36
351.1         2.23
352.6         2.24
354.2         2.25
355.8         2.29
357.4         2.28
358.9         2.23

为了将一个表与另一个表进行比较,我在这里提到另一个表rv1为rv2。 我使用的是用户选择的tablename中的数据rv1,以及数据库中所有表的rv2 公式是

  • I = ACOS [rv1.rv2 / | rv1 |。| rv2 |]

用于比较两个表的PostgreSQL查询如下所示,我想将一个表与数据库中的所有表进行比较,并为每个比较生成i值。

select
    acos(sum(t1.rv1 * t2.rv2) / (
        sqrt(sum(power(t1.rv1, 2))) * sqrt(sum(power(t2.rv2, 2)))
    )) as i
from
    t1
    inner join
    t2 on t1.wv1 = t2.wv2

此查询正在连接两个表并应用上述公式,然后显示正确的输出。现在我想将单个表(t1作为用户定义的表,t2作为数据库中的所有表)与数据库中的所有表进行比较,并为每个比较生成I值。我想为数据库中的所有表应用公式。

输出应该是这样的

最终输出

   Ivalue
   0.3559772512926 
   0.52684312
   .............
   .............

我想在PostgreSQL查询中编写公式,如何编写它。

3 个答案:

答案 0 :(得分:0)

然而,你看一下,它归结为几个选择,每个表一个,你可以与UNION ALL结合:

select acos(...
from t1 inner join t2 on t1.wv1 = t2.wv2
UNION ALL
select acos(...
from t1 inner join t3 on t1.wv1 = t3.wv3
UNION ALL
...

答案 1 :(得分:0)

如果我理解这一点,你实际上想要比较所有“看起来相似”的不同集合(即2列,相同行数,相同的wv1值),并且每个集合存储在一个新表中,对吧? / p>

我的第一个评论是:为什么不将所有集合存储在同一个表中,并添加一个额外的列(例如set_id),指向值对所属的集合。如果是这种情况,你可以创建一个这样的查询:

select t1.set_id as left_set_id,
       t2.set_id as right_set_id,
       acos(sum(t1.rv1 * t2.rv2) / ( sqrt(sum(power(t1.rv1, 2))) * sqrt(sum(power(t2.rv2, 2))))) as i
from bigtable as t1
inner join bigtable as t2 
        on t1.wv1 = t2.wv2
       AND t1.set_id > t2.set_id
GROUP BY t1.set_id,
         t2.set_id
ORDER BY t1.set_id,
         t2.set_id

注意:t1.set_id > t2.set_id避免你将一个集合与自身进行比较+似乎(对我而言)关系是对称的,所以你只需要在一个方向上比较集合。

更新,如果你只想将1套装与所有其他套装进行比较,你必须像这样使用它:

select t2.set_id,
       acos(sum(t1.rv1 * t2.rv2) / ( sqrt(sum(power(t1.rv1, 2))) * sqrt(sum(power(t2.rv2, 2))))) as i
from bigtable as t1
inner join bigtable as t2 
        on t1.wv1 = t2.wv2
       AND t1.set_id <> t2.set_id
WHERE t1.set_id = '<base set identifier>'
GROUP BY t2.set_id
ORDER BY t2.set_id

现在,由于我们没有这个,我们必须假装它。为此,我建议您创建一个UNION ALL所有表格的视图,然后您可以在视图上运行上述查询,而不是bigtable

CREATE VIEW bigview
AS 
SELECT 'table1' as set_id, wv1, rv1 FROM table1
UNION ALL
SELECT 'table2' as set_id, wv1, rv1 FROM table2
UNION ALL
SELECT 'table3' as set_id, wv1, rv1 FROM table3
UNION ALL
etc...

无论您要比较哪个集合(=表格),都可以重复使用此视图,但您必须确保它包含您希望包含在比较中的所有表格(=集合)。 / p>

PS:您可能需要对语法进行一些处理,没有PostgreSQL可用。 PS:the documentation提到您可以使用@来计算数字的绝对值;我猜这比拿广场的根更容易。它肯定不会出现溢出。

答案 2 :(得分:0)

它是通过JSP + PostgreSQL

制作的
String ss1 = "SELECT UPPER(table_name)FROM information_schema.tables where table_schema='public' and table_type='BASE TABLE' ORDER BY table_name ASC;";
stmt = connection.createStatement();
rset=stmt.executeQuery(ss1);

String ss1作为dbTab传递

String usTab ="oak";          
while (rset.next()) {
String sname1 = rset.getString(1);
String dbTab = sname1.toUpperCase(); 
try
{
out.println("<tr><td>"  + dbTab + "</td><td>"+ usTab + " vs " + dbTab + "</td>");
if(dbTab.equals(usTab)) continue;
Connection connection = DriverManager.getConnection(ss, "postgres", "acheive9");
String ss2 = "select acos(sum("+usTab+".reflectance * "+dbTab+".reflectance) / ( sqrt(sum(power("+usTab+".reflectance, 2))) * sqrt(sum(power("+dbTab+".reflectance, 2))))) as i from "+usTab+" inner join "+dbTab+" on "+usTab+".wavelength = "+dbTab+".wavelength";
stmt2 = connection.createStatement();
rset2=stmt2.executeQuery(ss2);
while (rset2.next()) {
String sname17 = rset2.getString(1);
out.println("<td>"+sname17+"</td></tr>");
}

本准则正在运作..