以下旧的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)"语法意味着。
答案 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)
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 非常仔细地测试查询结果。