我有一组列和表,在相应的下拉列表中,我正在使用代码生成基于表列选择的动态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
答案 0 :(得分:4)
以字符串为基础处理复杂的动态SQL字符串时,这是一个常见问题-难以正确处理其字符串形式的SQL语法,并且也很容易创建SQL注入漏洞。
SQL构建器API,例如jOOQ和others非常适合此任务。我不确定您遇到的问题到底是什么,但是我们只假设最后一个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)
直接说出语法错误:
表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
对于更广泛的问题,通用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