SQL Query构建器实用程序

时间:2014-08-04 13:09:54

标签: java sql sql-server database

我有一组列和表,在相应的下拉列表中,我正在使用代码生成基于表列选择的动态SQL

它适用于简单的Select语句,但在Multiple Joins的情况下,我试图找出handlin Right和Left Joins的语法。

请帮助..这是SQL语法的错误

1)
(Select dbo.Employee.Dept_ID,dbo.Employee.Emp_ID,dbo.Employee.Emp_Name,dbo.Employee_DataVal.DeptNo,
dbo.Employee_DataVal.EmpName,dbo.Employee_DataVal.EmpNo,dbo.Employee_DataVal.Salary,dbo.Emp_Sal.Emp_ID,dbo.Emp_Sal.Salary
FROM Employee
INNER JOIN Employee_DataVal
ON Employee.Dept_ID = Employee_DataVal.DeptNo
OR Employee_DataVal.EmpName = Employee.Emp_Name)
LEFT JOIN Emp_Sal
ON Employee.Emp_ID = Emp_Sal.Emp_ID

Incorrect syntax near the keyword 'LEFT'.

2)Select dbo.Employee.Dept_ID,dbo.Employee.Emp_ID,
dbo.Employee.Emp_Name,dbo.Employee_DataVal.DeptNo,
dbo.Employee_DataVal.EmpName,dbo.Employee_DataVal.EmpNo
,dbo.Emp_Sal.Emp_ID,dbo.Emp_Sal.Salary
FROM Employee INNER JOIN Employee_DataVal
ON Employee.Emp_ID = Employee_DataVal.EmpNo
AND Employee.Dept_ID = Employee_DataVal.DeptNo
LEFT JOIN Employee
ON Employee_DataVal.EmpName = Employee.Emp_Name

The objects "Employee" and "Employee" in the FROM clause have the same exposed names. Use correlation names to distinguish them.

PS:在SQL服务器上运行此SQL

4 个答案:

答案 0 :(得分:4)

以字符串为基础处理复杂的动态SQL字符串时,这是一个常见问题-难以正确处理其字符串形式的SQL语法,并且也很容易创建SQL注入漏洞。

SQL构建器API,例如jOOQothers非常适合此任务。我不确定您遇到的问题到底是什么,但是我们只假设最后一个LEFT JOIN在查询中是可选的。您可以编写这样的查询:

List<Field<?>> c = new ArrayList<>(Arrays.asList(
    EMPLOYEE.DEPT_ID,
    EMPLOYEE.EMP_ID,
    EMPLOYEE.EMP_NAME,
    EMPLOYEE_DATAVAL.DEPTNO,
    EMPLOYEE_DATAVAL.EMPNAME,
    EMPLOYEE_DATAVAL.EMPNO,
    EMPLOYEE_DATAVAL.SALARY
));
Table<?> t = EMPLOYEE
   .join(EMPLOYEE_DATAVAL)
     .on(EMPLOYEE.DEPT_ID.eq(EMPLOYEE_DATAVAL.DEPTNO)
     .or(EMPLOYEE_DATAVAL.EMPNAME.eq(EMPLOYEE.EMP_NAME));

if (someCondition) {
    t = t.leftJoin(EMP_SAL).on(EMPLOYEE.EMP_ID.eq(EMP_SAL.EMP_ID));
    c.addAll(Arrays.asList(
        EMP_SAL.EMP_ID,
        EMP_SAL.SALARY
    ));
}

Result<?> result =
ctx.select(c)
   .from(t)
   .fetch();

答案 1 :(得分:0)

直接说出语法错误:

  1. 此声明中的括号无效。删除它们将解决问题。
  2. 表Employee在FROM子句中使用了两次。您必须为表格设置别名才能生效。

    选择dbo.Employee.Dept_ID,dbo.Employee.Emp_ID, dbo.Employee.Emp_Name,dbo.Employee_DataVal.DeptNo, dbo.Employee_DataVal.EmpName,dbo.Employee_DataVal.EmpNo ,dbo.Emp_Sal.Emp_ID,dbo.Emp_Sal.Salary 来自员工e1 INNER JOIN Employee_DataVal ON e1.Emp_ID = Employee_DataVal.EmpNo AND e1.Dept_ID = Employee_DataVal.DeptNo LEFT JOIN员工e2 ON Employee_DataVal.EmpName = e2.Emp_Name

  3. 对于更广泛的问题,通用SQL查询生成器的概念非常普遍,并且有多个实现。您将无法在此类论坛中找到完整的实施指南。

    干杯!

答案 2 :(得分:0)

您正在使用LEFT加入与自联接相同。这实际上是在创造问题。

答案 3 :(得分:0)

在第一种情况下,错误即将发生,因为错误的)位于错误的位置,如下所示;哪个结束查询,所以LEFT JOIN抛出错误。 )必须位于查询的末尾。

FROM Employee
INNER JOIN Employee_DataVal
ON Employee.Dept_ID = Employee_DataVal.DeptNo
OR Employee_DataVal.EmpName = Employee.Emp_Name ) <--Here
LEFT JOIN Emp_Sal

在第二种情况下,在这种情况下,您尝试对同一个表执行self join因为错误已经建议您,您需要使用correlation names之类的

FROM Employee emp1 <-- Here used a table alias emp1
INNER JOIN Employee_DataVal ed
ON emp1.Emp_ID = ed.EmpNo
AND emp.Dept_ID = ed.DeptNo
LEFT JOIN Employee emp2 <-- Here used a different table alias emp2
ON ed.EmpName = emp2.Emp_Name

此外,LEFT JOIN Employee在这里没有任何意义,可以简单地修改为代码

FROM Employee emp1 
INNER JOIN Employee_DataVal ed
ON emp1.Emp_ID = ed.EmpNo
AND emp.Dept_ID = ed.DeptNo
AND emp.Emp_Name = ed.EmpName <-- here by adding another join condition