Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 将一个表与数据库中的所有表进行比较_Sql_Postgresql - Fatal编程技术网

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

Sql 将一个表与数据库中的所有表进行比较,sql,postgresql,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

这是示例表数据。我的数据库由这么多这样的表组成。在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值。我想对数据库中的所有表应用公式

输出应该是这样的

最终输出

我想在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\u id>t2.set\u 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
然后,无论比较的是哪一个集合(=表),都可以重新使用此视图,但您必须确保它包含要包括在比较中的所有表格(=集)

PS:您可能需要对语法进行一些修改,因为这里没有可用的PostgreSQL。
注:您可以使用
@
计算数字的绝对值;我猜这比求平方根容易。它肯定不会太容易溢出。

它是通过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>");
}
String usTab=“oak”;
while(rset.next()){
String sname1=rset.getString(1);
字符串dbTab=sname1.toUpperCase();
尝试
{
out.println(“+dbTab+”+usTab+”vs“+dbTab+”);
如果(dbTab.equals(usTab))继续;
Connection-Connection=DriverManager.getConnection(ss,“postgres”,“acheive9”);
字符串ss2=“选择acos(总和(“+usTab+”.reflective*”+dbTab+”.reflective)/(sqrt(总和(“+usTab+”.reflective,2)))*sqrt(总和(“+dbTab+”.reflective,2“)”)作为i,从“+usTab+”内部连接“+dbTab+”在“+usTab+”上。波长=“+dbTab+”。波长”;
stmt2=connection.createStatement();
rset2=stmt2.executeQuery(ss2);
while(rset2.next()){
String sname17=rset2.getString(1);
out.println(“+sname17+”);
}

这段代码正在运行..

啊,好的,开始破晓了…您想将一个特定的集合与所有其他集合进行比较,并显示结果…我将调整我的答案。是否有任何方法可以在jsp中执行此任务?可能,但我没有在中找到任何jsp的经验,然后您必须动态地构建select语句来选择表来自所有表或所有表的名称。编辑:Oops,很抱歉,这是Oracle,但postgresql中肯定也有系统表包含表名。您说您不知道表名。SQL需要表名才能使用。如果您无法在SQL语句中命名表,则无法选择数据。dbms通常使用system个表来保存表名、列名等。因此您可以选择表名。但是,您不能在SQL中直接使用它们,因为无法告诉SQL“刚才选择的字符串实际上是表名;请使用这些字符串从中选择数据”。您只能选择表名,使用它们构建SQL(手动或使用编程语言)然后使用该SQL选择所需内容。不,没有SQL命令可从数据库中的所有表中进行选择。在SQL中,必须明确说明要访问哪些表。(此外:奇怪的是,在您的数据库中有这么多表,您甚至不知道它们的名称。它们是动态添加的吗?听起来很糟糕。通常添加数据的表很少,而不是表!)
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 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>");
}