将Informix SQL查询转换为ANSI-92 SQL?

时间:2014-12-20 21:51:53

标签: informix

以下旧的Informix SQL查询的ANSI-92等价物是什么?

select * 
from categories c,
  orders o, 
  outer (employees e, person p) 
where c.categoryid = o.categoryid
  and p.personid = e.id
  and o.employeeid = e.id
  and o.orderid = 7742
  and e.term_date is NULL

我似乎无法弄明白"外部(table1,table2)"语法意味着。

2 个答案:

答案 0 :(得分:2)

类似的东西:

select  *
from        categories c
Join        orders o
on          c.categoryid = o.categoryid
Left Join employees e
on          o.employeeid = e.id
Join        person p
on          e.id = p.personid
where       o.orderid = 7742
and         e.term_data is null

答案 1 :(得分:1)

我认为,Mike Burdickanswer {{3}}基本上是正确的 - 但我并不完全确定。如果查询被写成:

,我会对比较感到更舒服
SELECT *
  FROM Categories AS C
  JOIN Orders     AS O ON C.CategoryID = O.CategoryID
  LEFT JOIN
       (SELECT * FROM
          FROM Employees AS E
          JOIN Person    AS P ON E.ID = P.PersonID
       ) AS E ON O.EmployeeID = E.ID
 WHERE O.OrderID = 7742
   AND E.Term_Data IS NULL

原始查询中的OUTER (Employees e, Person p)是一个内连接子查询,它与外部连接到主查询,我通过使用子查询在我的版本中更清楚,但我认为迈克的版本也行。我担心的是Mike的版本可能更接近于此(在这种情况下employees e周围的括号是可选的):

select * 
from categories c,
  orders o, 
  outer (employees e),
  person p
where c.categoryid = o.categoryid
  and p.personid = e.id
  and o.employeeid = e.id
  and o.orderid = 7742
  and e.term_date is NULL

在提出可以区分两个查询的数据集之前我需要仔细思考(问题中的原始查询和上面的轻微重写,或Mike的回答和我的回答)。

另一个令人不安的疑问是,Informix的旧式非标准OUTER连接符号有一个标准符号根本不支持的怪癖。过滤下级表中的数据(左外连接的RHS)时可能会发生此问题。主导表中的行(在本例中为表 - 顺序和类别)由Informix保留,即使下级表中的匹配已被过滤掉。我认为这次运作正常,因为我关注的过滤条件AND e.term_date IS NULL使用IS NULL。如果过滤条件为AND e.term_date > MDY(7,4,2032)并且员工中有一行与过滤条件不匹配),您可能会遇到问题,但我认为IS NULL没问题。 Informix的行为很难解释,并且很难证明“它的工作方式是正确的,并且它在1987年±2年内被证明可以工作,并且向后兼容性处理其余部分”。它只是 只有Informix的OUTER连接符号,表现得很奇怪。 ANSI标准LEFT OUTER JOIN符号根据标准工作。但如果这个怪癖影响您的遗留代码,它确实会使转换成为一项挑战。

TL; DR 非常仔细地测试查询结果。