总结:
1.在代码中书写sql语句
SELECT 库名.表名.列名 AS 列的重命名..... FROM 库名.表名
2.数据库账号一定要有访问两个数据库的权限
使用背景:
这周分配的任务是做一个报表,报表里的有两个字段作为查询条件,是另一张表中的两个字段,但作为基表的表和这张表不在同一个数据库内,所以涉及到了跨库查询。
过程:
还好有同事刚做过跨库查询,询问后得知需要先在基表所在的库中创建一个视图(类似于一个根据查询结果组成的表),然后跟基表做关联查询,
SELECT "库名"."表名"."列名" AS "列的重命名"..... FROM "库名"."表名"(同事告诉的代码公式)
但生产环境我们这些苦逼的程序员没有权限去创建视图,所以只能将视图的代码写在程序中。
我把我的sql语句写到写到代码里后,运行、调接口、报错一气呵成,报SQL语句错误
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '."表名"."列名" AS "列名重命名",' at line 1
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
'."表名"."列名" AS "列名重命名",' at line 1
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
在我尝试运行同事的代码后,发现他的本地也运行不了,但是能在测试环境运行,因为是头一次做跨库查询,我很是害怕代码错误,一直想在本地测试一下。
再一次偶然间我的代码不报错了
SELECT 库名.表名.列名 AS 列的重命名..... FROM 库名.表名
发现不用在库名和表名、列名前后添加“双引号”之后,在本地运行不再报错。
上传测试环境后,莫名其妙开始报错,查询后发现之前的数据库账号只有当前库的访问权限,在申请并更换了有两个库权限的账号后,即可正常的使用报表