我遇到一个j2ee项目,它是一个可以通过用户定义的结果和条件动态构造SQL的系统。我建议这样做: korzh 的 EasyQuery:DEMO
用户在此系统中可以执行的操作是:
- 配置结果
- 配置条件
- 执行自动生成的 SQL
我的问题是:如何生成由用户配置的sql语句,这些用户选择的结果或条件字段可能位于不同的表中,我很困惑这些表也许相关,但也可能不相关。
例如,如图所示,
- 我选择了客户(表)-> [客户公司名称]、[订单 ID] (字段)作为结果。
- 我选择了 Product(table) -> [Product ID = 1] 作为条件。
系统会生成一条SQL:
SELECT DISTINCT Customers.CompanyName AS "Customer Company name", Orders.OrderID AS "Order ID"
FROM (((Customers AS Customers
INNER JOIN Orders AS Orders ON (Customers.CustomerID = Orders.CustomerID ))
INNER JOIN Order_Details AS Order_Details ON (Orders.OrderID = Order_Details.OrderID ))
INNER JOIN Products AS Products ON (Products.ProductID = Order_Details.ProductID ))
WHERE
( Products.ProductID = 1 )
系统如何找出这些表之间的内在关系,例如:
(((Customers AS Customers
INNER JOIN Orders AS Orders ON (Customers.CustomerID = Orders.CustomerID ))
INNER JOIN Order_Details AS Order_Details ON (Orders.OrderID = Order_Details.OrderID ))
INNER JOIN Products AS Products ON (Products.ProductID = Order_Details.ProductID ))
换句话说,我想知道“即席查询”是如何通过用户的配置生成可行的SQL语句的。有没有Java的库?
非常感谢您的帮助。
最佳答案
您可以使用 MySQL INFORMATION_SCHEMA 获取表之间的关系 例如。
select
TABLE_NAME,COLUMN_NAME,CONSTRAINT_NAME, REFERENCED_TABLE_NAME,REFERENCED_COLUMN_NAME
from INFORMATION_SCHEMA.KEY_COLUMN_USAGE
where
REFERENCED_TABLE_NAME = '<table>';
来自here
这样就可以获得一张表的所有引用字段。浏览所有表格,构建与列名称的关系图。
然后在您的查询中只需包含所有必要的表并使用它们的关系来创建 INNER JOIN 条件并正确填充 FROM 部分(一个表可以包含多次,因此您可能需要别名)
然后只需将连接表的必要字段包含到 SELECT 和 WHERE 部分即可。
关于java - 根据用户定义的结果和条件在包含多个相关或不相关表的数据库中动态构建 SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34013884/