ResultSetMetaData.getColumnName为UNION和非UNION查询返回不同的值

时间:2014-05-15 13:12:42

标签: java mysql jdbc

使用Java JDBC,我想收集从SQL Select查询返回的信息。

如果我在SQL查询下面触发:

SELECT col1 AS 'Field1', col2 AS 'Field2' FROM Table;

然后,使用resultSetMetaData.getColumnName(1),我得到'col1'作为结果,这是预期的结果。

现在,问题是,当我加入2个SQL表时(因为,MySQL不提供Full Outer Join,因此,我解除了以下查询)

SELECT Table1.Col1 AS 'Field1', Table1.Col3 AS 'Field2',
Table2.Col5 AS 'Field3',Table2.Col4 AS 'Field4' FROM Table1 
LEFT JOIN Table2 ON Table1.id = Table2.id 
UNION 
SELECT Table1.Col1 AS 'Field1', Table1.Col3 AS 'Field2', 
Table2.Col5 AS 'Field3',Table2.Col4 AS 'Field4' FROM Table1 
RIGHT JOIN Table2 ON Table1.id = Table2.id;

现在,使用resultSetMetaData.getColumnName(1),我得到'Field1'作为结果,其中,我预期'col1'。

我也试过了resultSetMetaData.getColumnLabel(1),但它仍然返回'Field1'。

我希望'col1'作为结果,我无法通过resultSetMetaData的任何方法获得。

对此的任何帮助都会很明显。

1 个答案:

答案 0 :(得分:0)

您正在查看这些结果,因为它是UNION查询。这样的查询完全有可能做类似

的事情
SELECT Col1 AS Field1 FROM Table1
UNION
SELECT Col2 AS Field1 FROM Table2

在这种情况下,如果getColumnName尝试返回结果中基础列的名称,则没有单一的“正确”答案:它应该返回“Col1”还是“Col2”?

由于UNION查询的结果集中的任何列都可以从多个底层列派生,因此getColumnName只能返回有效名称该列,在上例中为Field1