繁体   English   中英

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

[英]Compare one table with all tables in database

这是样本表数据。 我的数据库包含如此多的表。 在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。 我正在使用用户选择的表名中的数据rv1和数据库中所有表的rv2

  • 我= 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查询中编写公式,如何编写。

无论您如何看,它都归结为几个选择,每个表一个,您可以将其与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
...

如果我正确理解这一点,那么您实际上想比较所有“看起来都一样”的不同集合(即2列,相同的行数,相同的wv1值),并且每个集合都存储在一个新表中,对吗?

我的第一句话是:为什么不将所有集合存储在同一张表中,并添加一个额外的列(例如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避免了将集合与自身进行比较+(对我而言)该关系无论如何都是对称的,因此您只需要在一个方向上比较集合即可。

更新,如果您只想将一个集合与所有其他集合进行比较,则必须像这样使用它:

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...

然后,无论您要比较哪个集(=表),都可以重复使用此视图,尽管该视图必须包括要包含在比较中的所有表(=集),但您必须确保此视图。

PS:您可能需要在语法上做一些工作,这里没有PostgreSQL。 PS: 文档中提到您可以使用@来计算数字的绝对值; 我想这会比平方根更容易。 它肯定会更不容易溢出。

它是通过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);

字符串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>");
}

该代码正在工作..

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM