在具有相似列的两个数据库表之间准备比较查询

时间:2014-01-15 04:20:39

标签: java sql db2 hsqldb

给定两个表,每个表有n列,其中1到n-1列是一起形成唯一键的列,第n列是值列,如何在我的java程序中创建一个通用查询,输出1到n-1列,第一个表的第n列,第二个表的第n列以及两个表的第n列的差异。

例如当n = 2时,即当给定的表有两列,其中第一列是键,第二列是值,我的查询将是:

SELECT 
  COALESCE(A.COL1, B.COL1) AS COL1, 
  CAST(A.VALCOL AS DECIMAL(18,2)) AS SRC_TAB_VALUE, 
  CAST(B.VALCOL AS DECIMAL(18,2)) AS TRGT_TAB_VALUE, 
  CAST(CAST(A.VALCOL AS DECIMAL(18,2)) - cast(B.VALCOL AS DECIMAL(18,2)) AS DECIMAL(18,2)) AS DIFF_OF_VAL 
FROM 
  SCHEMA1.TAB1 A 
FULL JOIN 
  SCHEMA2.TAB2 B 
ON A.COL1 = B.COL1 
  ORDER BY COL1

我正在Java程序中准备上面的查询。上面的diff查询针对两个内存HSQL表运行。

但是,当关键列的数量大于1时,如何概括此查询。

e.g。给定两个表,每个表有5列,前4列的组合将创建唯一键,而第五列将是要比较的键的值。

感谢阅读!

2 个答案:

答案 0 :(得分:1)

虽然您的问题写得很清楚,但它没有提供足够的详细信息,例如为什么要做这样的事情?

严重的是,SQL不适合“通用查询”。所以你需要有充分的理由以这种困难的方式做到这一点。

此外,您的查询在选中时会SRC_TAB_VALUETRGT_TAB_VALUE被投放为DECIMAL(18,2),并且在扣除时 - 为什么这是必要的,它们不是十进制的开头? VALUE列始终是数字吗?关键栏怎么样?他们也被施展,所以可能是数字?如果它们包含非数字字符,则CAST将失败。为什么没有WHERE条款限制您的结果?

在对SQL解决方案进行一些奇怪的尝试之前,我不得不问:为什么java代码不能只生成适当的SQL本身?

这似乎是一个有目的的迟钝问题,除非你以错误的方式解决问题,否则不应该出现这个问题。

答案 1 :(得分:0)

以不同的方式处理您的问题,这是另一个答案。

如果您希望SQL尽可能通用,以便在Java中生成它,您可以这样写:

WITH 
  TABLEA (COL1,COL2,COLN) AS (SELECT * FROM SCHEMA1.TAB1),
  TABLEB (COL1,COL2,COLN) AS (SELECT * FROM SCHEMA2.TAB2)        
SELECT 
  COALESCE(TABLEA.COL1,TABLEB.COL1) AS COL1, 
  COALESCE(TABLEA.COL2,TABLEB.COL2) AS COL2, 
  TABLEA.COLN AS COLN_A, 
  TABLEB.COLN AS COLN_B, 
  (TABLEA.COLN-TABLEB.COLN) AS DIFF
FROM TABLEA
FULL OUTER JOIN TABLEB
  ON  TABLEA.COL1=TABLEB.COL1 
  AND TABLEA.COL2=TABLEB.COL2
;

该示例适用于3个列表。其所在位置COL2应替换为COL2COL3,... COLn-1,以适应表格的大小。我看到有四个必要的地方:TABLEA的创建,TABLEB的创建[注意这些是相同的,所以代码只需要生成一次子句并使用它两次], SELECT COALESCE(TABLEA.COLn,TABLEB.COLn) AS COLnON条款AND TABLEA.COLn=TABLEB.COLn

显然,您还必须根据需要替换SCHEMA1.TAB1SCHEMA2.TAB2。其余的代码应该是通用的,您不需要使用实际的列名,这应该使Java代码更简单。