Java SQL查询生成器实用程序

Java SQL查询生成器实用程序,java,sql,sql-server,database,Java,Sql,Sql Server,Database,我有一组列和表,在各自的下拉列表中,我正在编写一个代码,根据表列选择生成动态SQL 它适用于简单的Select语句,但在多个联接的情况下,我试图找出handlin Right和Left联接的语法 请帮助..这是SQL语法的错误 1) (Select dbo.Employee.Dept_ID,dbo.Employee.Emp_ID,dbo.Employee.Emp_Name,dbo.Employee_DataVal.DeptNo, dbo.Employee_DataVal.EmpName,dbo.

我有一组列和表,在各自的下拉列表中,我正在编写一个代码,根据表列选择生成动态SQL

它适用于简单的Select语句,但在多个联接的情况下,我试图找出handlin Right和Left联接的语法

请帮助..这是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 server上运行此sql直接针对语法错误:

  • 此语句中的括号无效。移除它们将解决问题
  • 表Employee在FROM子句中使用了两次。必须为这些表设置别名才能使其工作

    选择dbo.Employee.Dept\u ID,dbo.Employee.Emp\u 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内部加入员工_DataVal 在e1.Emp_ID=Employee_DataVal.EmpNo上 e1.Dept_ID=Employee_DataVal.DeptNo 左加入员工e2 在Employee_DataVal.EmpName=e2.Emp_Name上


  • 谈到您更广泛的问题,通用SQL查询生成器的概念非常常见,并且已经有了几个实现。在这样的论坛上,您不会找到完整的实施指南


    干杯

    直接与语法错误对话:

  • 此语句中的括号无效。移除它们将解决问题
  • 表Employee在FROM子句中使用了两次。必须为这些表设置别名才能使其工作

    选择dbo.Employee.Dept\u ID,dbo.Employee.Emp\u 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内部加入员工_DataVal 在e1.Emp_ID=Employee_DataVal.EmpNo上 e1.Dept_ID=Employee_DataVal.DeptNo 左加入员工e2 在Employee_DataVal.EmpName=e2.Emp_Name上


  • 谈到您更广泛的问题,通用SQL查询生成器的概念非常常见,并且已经有了几个实现。在这样的论坛上,您不会找到完整的实施指南


    干杯

    您使用的左联接与自联接相同。这实际上造成了问题

    您使用的左联接与自联接相同。这实际上造成了问题

    在第一种情况下,由于错误的
    出现错误,如下所示;这使得查询结束,因此
    左连接
    抛出错误。
    必须位于查询的末尾

    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
    
    此外,
    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
    
    来自员工emp1
    内部联接雇员数据值
    关于emp1.Emp_ID=ed.EmpNo
    而emp.Dept_ID=ed.DeptNo
    
    并且emp.emp_Name=ed.EmpName在第一种情况下,由于错误的
    位于错误的位置,出现错误,如下所示;这使得查询结束,因此
    左连接
    抛出错误。
    必须位于查询的末尾

    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
    
    此外,
    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
    
    来自员工emp1
    内部联接雇员数据值
    关于emp1.Emp_ID=ed.EmpNo
    而emp.Dept_ID=ed.DeptNo
    
    emp.emp_Name=ed.EmpName这是在字符串基础上处理复杂的动态SQL字符串时的常见问题-很难正确处理字符串形式的SQL语法,也很容易创建SQL注入漏洞

    SQL builder API喜欢并非常适合此任务。我不确定您的问题到底是什么,但让我们假设最后一个
    左连接在您的查询中是可选的。您可以编写如下查询:

    List t=员工
    .join(员工数据值)
    .on(员工部门ID.eq(员工数据部门)
    .或(EMPLOYEE_DATAVAL.EMPNAME.eq(EMPLOYEE.EMP_NAME));
    如果(某些条件){
    t=t.leftJoin(EMP_SAL).on(EMPLOYEE.EMP_ID.eq(EMP_SAL.EMP_ID));
    c、 addAll(Arrays.asList)(
    EMP_SAL.EMP_ID,
    EMP_SAL.薪水
    ));
    }
    结果=
    ctx.选择(c)
    .来自(t)
    .fetch();
    
    在以字符串为基础处理复杂的动态SQL字符串时,这是一个常见问题-很难正确处理字符串形式的SQL语法,也很容易创建SQL注入漏洞

    SQL builder API喜欢并且非常适合此任务。我不确定您的问题到底是什么,但让我们假设最后一个
    左连接在查询中是可选的。您可以编写如下查询:

    List t=员工
    .join(员工数据值)
    .on(员工部门ID.eq(员工数据部门)
    .或(EMPLOYEE_DATAVAL.EMPNAME.eq(EMPLOYEE.EMP_NAME));
    如果(某些条件){
    t=t.leftJoin(EMP_SAL).on(EMPLOYEE.EMP_ID.eq(EMP_SAL.EMP_ID));
    c、 addAll(Arrays.asList)(
    EMP_SAL.EMP_ID,
    EMP_SAL.薪水
    ));
    }
    结果=
    ctx.选择(c)
    .来自(t)
    .fetch();
    
    按照错误指示执行:-)给db一个临时名称,这样这个FROM Employee internal JOIN Employee_DataVal就变成FROM Employee e internal JOIN Employee_DataVal,然后只需在字段前面加上前缀,以便快速响应,正如我提到的,我必须构建一个动态查询,因此,如果用户在不同的表XTable之间从UI添加正确的连接,那么我该如何继续?语法方面,也是java编程方面的?按照错误所述操作:-)给db一个临时名称,因此这个FROM Employee internal JOIN Employee_DataVal变成FROM Employee e internal JOIN Employee_DataVal,然后只需在字段前加前缀,以便快速响应,正如我提到的,我必须构建一个动态查询,所以,在任何时刻,如果用户从UI在不同的表XTable之间添加了一个右连接,那么我应该如何继续?通用SQL查询生成器的概念