java - 当给定查询在左连接中有内部查询时如何获取列名和列标签
问题描述
谁能帮我获取实际的列名及其别名ResultSetMetaData
class MysqlCon {
public static void main(String args[]) {
Connection con = null;
try {
Class.forName("com.mysql.jdbc.Driver");
con = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "root");
Statement stmt = con.createStatement();
String query = "SELECT \n" +
" RA_Min_1 AS 'ran Min',\n" +
" RA_Max_1 AS 'ran Max' \n" +
"FROM\n" +
" `Masters` m \n" +
" LEFT JOIN \n" +
" (SELECT \n" +
" mr.`Master_ID`,\n" +
" `RA_Min_1`,\n" +
" `RA_Max_1` \n" +
" FROM\n" +
" `Master_Attribute_Range` mr \n" +
" INNER JOIN `Masters` m \n" +
" ON m.`Master_Type_ID` = 3 \n" +
" AND mr.`Master_ID` = m.`Master_ID`) mar\n" +
" ON mar.Master_ID = m.`Master_ID` \n" +
" AND m.`Master_Type_ID` = 3 \n" +
"ORDER BY RA_min_1 \n" +
"LIMIT 0, 25 ";
ResultSet rs = stmt.executeQuery(query);
ResultSetMetaData rsm =rs.getMetaData();
for (int i = 1; i <= rsm.getColumnCount(); i++) {
System.out.println(rsm.getColumnLabel(i) + "--" + rsm.getColumnName(i));
}
} catch (Exception e) {
System.out.println(e);
} finally {
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
输出
ran Min--ran Min
ran Max--ran Max
在这里,如果我删除ORDER BY RA_min_1
子句,那么它将返回预期的输出:
ran Min--RA_Min_1
ran Max--RA_Max_1
更新
首先很抱歉,由于我遇到了一些个人问题,因此无法回复,并且由于这些问题,我无法查看堆栈溢出。请原谅我。谢谢。
没有子查询的普通查询将按预期给出结果。但我有一种情况,我必须使用子查询并且需要别名和实际字段名。
在这里提出问题,我已经截断了只有一个字段的子查询,但在实际场景中,LEFT JOIN 之后的子查询非常大并且包含许多列,例如RA_Min_1, RA_Max_1,RA_Min_2, RA_Max_2,...RA_Min_50, RA_Max_50 and some other columns
.
我们正在准备动态查询,其中有时我们有RA_Min_1, RA_Max_1
,有时RA_Min_2, RA_Max_2
。
所以,我在这里寻找带有子查询的解决方案。
任何帮助将不胜感激!!
谢谢。
解决方案
让我们将完整的查询视为多行文本。
SELECT
RA_Min_1 AS 'ran Min',
RA_Max_1 AS 'ran Max'
FROM
`Masters` m
LEFT JOIN
(SELECT
mr.`Master_ID`,
`RA_Min_1`,
`RA_Max_1`
FROM
`Master_Attribute_Range` mr
INNER JOIN `Masters` m
ON m.`Master_Type_ID` = 3
AND mr.`Master_ID` = m.`Master_ID`) mar
ON mar.Master_ID = m.`Master_ID`
AND m.`Master_Type_ID` = 3
ORDER BY RA_min_1
LIMIT 0, 25
选定的字段列表不明确。子查询别名为mar
hasRA_Min_1
和RA_Max_1
fields ,因此当它与masters
table 连接时,可用字段将为m.RA_Min_1
, m.RA_Max_1
, mar.RA_Min_1
, mar.RA_Max_1
。
如果显式或隐式选择子查询中的字段。例如
SELECT
mar.RA_Min_1 AS 'ran Min',
mar.RA_Max_1 AS 'ran Max'
-- ...
ORDER BY mar.RA_min_1
LIMIT 0, 25
输出
ran Min--ran Min
ran Max--ran Max
然后,结果集会丢失有关结果集元数据中列名的信息。
为了保留原始列名,尽可能选择表中的字段。
SELECT
m.RA_Min_1 AS 'ran Min',
m.RA_Max_1 AS 'ran Max'
-- ...
ORDER BY m.RA_min_1
LIMIT 0, 25;
输出
ran Min--RA_Min_1
ran Max--RA_Max_1
可以重构查询,因为子选择查询正在连接选择查询中的同一个表。
SELECT
m.RA_Min_1 AS 'ran Min',
m.RA_Max_1 AS 'ran Max'
FROM
Masters
m
LEFT JOIN
(SELECT
mr.
Master_ID
, RA_Min_1
, RA_Max_1
FROM
Master_Attribute_Range
mr
INNER JOIN
ON m.Masters
m Master_Type_ID
= 3
AND mr.Master_ID
= m.Master_ID
) mar
ON mar.Master_ID = m.
Master_ID
AND m.
ORDER BY m.RA_min_1
LIMIT 0, 25
Master_Type_ID
= 3
这是
SELECT
m.RA_Min_1 AS 'ran Min',
m.RA_Max_1 AS 'ran Max'
FROM
Masters AS m
LEFT JOIN
Master_Attribute_Range AS mr
ON m.Master_Type_ID = 3
AND mr.Master_ID = m.Master_ID
ORDER BY m.RA_min_1
LIMIT 0, 25
推荐阅读
- ruby-on-rails - 检查字符串是否属于枚举作为值
- c++ - 在 Visual Studio 2015 中链接 .lib
- matlab - 将 .ods 工作表加载到 Octave 时出错
- javascript - React Native localeCompare 在 Android 上不起作用
- r - R中线性回归的引导标准误差
- java - 如何实现 Guava 缓存来存储和获取不同类型的对象?
- angular - 角 | 如何使用 ng-template 或任何方法将 ng-content/child 内容置于组件之外
- c# - 如何将带小数点的字符串转换为带小数点逗号的双精度?
- angular - Primeng - 如何在多选/下拉列表的标题中添加一个按钮?
- vb.net - 想要将文本框中的行添加到列表框中,如果它包含单词中的单词