2013-03-27 92 views
1

我有兩個數據庫具有相同的結構,我想比較數據庫之間的記錄。第二個數據庫中的記錄是從第一個數據庫複製的,但複製過程有時不起作用,並且在一個表的第一個數據庫中,我有比第二個數據庫中的同一個表中的記錄多的記錄。所以我想知道第一個數據庫中的哪些記錄不存在於第二個數據庫中。我曾嘗試過類似的東西:處理查詢中的空結果集

<etl> 
<connection id="db1" driver="auto" 
    url="jdbc:mysql://localhost:3306/db" user="user" 
    password="xxx" 
    classpath="C:/mysql-connector-java-5.1.20.jar" /> 
<connection id="db2" driver="auto" 
    url="jdbc:mysql://localhost:3307/db" user="user" 
    password="xxx" 
    classpath="C:/mysql-connector-java-5.1.20.jar" /> 
<connection id="text" driver="text" /> 
<query connection-id="db1"> 
    SELECT * FROM table; 
    <query connection-id="db2"> 
     SELECT * FROM table WHERE id = '$id'; 
     <script connection-id="text"> 
      sometext, $rownum 
     </script> 
    </query> 
</query> 
</etl> 

問題是,當針對db2的查詢結果爲空時,腳本未執行。

如何解決這個問題?

問候, 亞切克

回答

1

您可以使用計數來檢查記錄的實際數量。在這種情況下,結果集將始終返回一行。例如:

<query connection-id="db1"> 
    SELECT * FROM table; 
    <query connection-id="db2"> 
     SELECT count(id) as CNT FROM table WHERE id = ?id; 
     <!-- The script is executed ONLY IF number of results is zero --> 
     <script connection-id="text" if="CNT==0"> 
      No matching record for id $id 
     </script> 
    </query> 
</query> 
+0

太好了!有用!問題是我不明白嵌套查詢和腳本中變量的可見性。我在哪裏可以找到一個好的描述? – user1337302 2013-03-29 08:22:16

+0

恐怕沒有簡單的解釋變量上下文是如何工作的。我會在scriptella.wordpress.com上發佈一篇文章,如果我終於得到了一些時間(你知道操作系統人員吸收正確的文件)。但簡單地說,這個想法很簡單 - 執行查詢時,對於每個返回的行,它調用嵌套的腳本(或其他查詢元素),當前行的列值可作爲這些**內**元素的變量。您可以將查詢包含到其他查詢中,但是邏輯相同,所有父列僅適用於子級,但不適用於兄弟。 – ejboy 2013-03-29 12:38:52

0

也許他並不需要if條件,因爲他的問題是沒有執行腳本;)

+0

我假設你回答我的[答案](http://stackoverflow.com/a/15661587/1129542)。該腳本沒有執行,因爲結果爲零。使用COUNT(*)時,總是有一行包含找到的記錄數。 – ejboy 2013-03-28 15:24:43

+0

是的,這**如果**對於非常重要,則可以在etl.xml文件中插入邏輯。 – user1337302 2013-03-29 08:23:59

+0

哦,明白了,我認爲其初衷如下所示: '... SELECT count(id)as CNT FROM table WHERE id =?id; ... ' – Jayr 2013-03-30 10:50:15