给定两个表,每个表有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列的组合将创建唯一键,而第五列将是要比较的键的值。
感谢阅读!
答案 0 :(得分:1)
虽然您的问题写得很清楚,但它没有提供足够的详细信息,例如为什么要做这样的事情?
严重的是,SQL不适合“通用查询”。所以你需要有充分的理由以这种困难的方式做到这一点。
此外,您的查询在选中时会SRC_TAB_VALUE
和TRGT_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
应替换为COL2
,COL3
,... COLn-1
,以适应表格的大小。我看到有四个必要的地方:TABLEA
的创建,TABLEB
的创建[注意这些是相同的,所以代码只需要生成一次子句并使用它两次], SELECT COALESCE(TABLEA.COLn,TABLEB.COLn) AS COLn
和ON
条款AND TABLEA.COLn=TABLEB.COLn
。
显然,您还必须根据需要替换SCHEMA1.TAB1
和SCHEMA2.TAB2
。其余的代码应该是通用的,您不需要使用实际的列名,这应该使Java代码更简单。