2013-03-27 98 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