簡體   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