【问题标题】:Left outer join with subqueries with an inner join带有子查询的左外连接和内连接
【发布时间】:2019-05-24 17:20:44
【问题描述】:

我有一个 SQL 查询,我想使用 Criteria API 进行转换。

我想将EMPLOYEE 的左外连接与使用内连接查询不同表的子查询的结果集结合起来。

SELECT 
    E1.EMPNO, E1.LASTNAME, E1.WORKDEPT, D1.DEPTNAME ,O1.OrgId
FROM 
    E1.EMPLOYEE 
LEFT OUTER JOIN
    (SELECT * 
     FROM Organization O1 
     INNER JOIN Departmental D2 ON D2.OrgId = O1.OrgId
     INNER JOIN Departmental D3 ON D3.OrgId = E2.OrgId) D1 ON D1.DeptNo = E1.WORKDEPT

【问题讨论】:

  • 这里你需要写FROM EMPLOYEE E1,因为你在select语句中使用了表别名E1。

标签: sql-server join criteria hibernate-criteria criteria-api


【解决方案1】:

请检查以下 SQL 查询

SELECT 
    E1.EMPNO, E1.LASTNAME, E1.WORKDEPT, D1.DEPTNAME, 
    D1.O1OrgId
FROM E1.EMPLOYEE 
LEFT OUTER JOIN ( 
    select
        O1.OrgId as O1OrgId,
        D1.DeptNo as D1DeptNo
    from Organization O1 
    inner join Departmental D1 
        on D1.OrgId=O1.OrgId
) D1 
    on D1.D1DeptNo = E1.WORKDEPT

不能从外部 SQL SELECT 语句引用子选择中使用的表别名

表别名也有一个范围

您只能从外部查询的子选择语句中引用 SELECT 列表中的字段

【讨论】:

  • ya 查询可能不是一个正确的查询,但问题是关于 Criteria API 如何编写 Leftouterjoin 子查询具有不同的表和内部联接
  • 已更正查询,请帮助
  • 您的 qyery 仍有问题。例如,E2 别名表不存在,但您在连接条件中使用了 E2 别名。在外部 SELECT 的字段列表中,有一列“O1.OrgId”具有未定义的别名 O1。 O1 别名仅在内部 SELECT 语句中可见。内部 SELECT 的所有输出字段都应在外部 SELECT 语句中引用为 D1
【解决方案2】:

您可以编写如下所示的查询。在这里,您为同一张表Departmental 多次加入相同的别名D1

SELECT 
    E1.EMPNO, E1.LASTNAME, E1.WORKDEPT, D1.DEPTNAME ,O1.OrgId
FROM 
    EMPLOYEE E1
LEFT OUTER JOIN
    (SELECT * 
     FROM Organization O1 
     INNER JOIN Departmental D2 ON D2.OrgId = O1.OrgId
     INNER JOIN Departmental D3 ON D3.OrgId = E2.OrgId
     -- add where condition if required
    ) D1 
     ON D1.DeptNo = E1.WORKDEPT
   -- add where condition if required

【讨论】:

  • 想成为标准
  • 您可以在内部或外部查询中放置 where 条件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-03
  • 1970-01-01
  • 2013-08-17
  • 1970-01-01
相关资源
最近更新 更多