从没有join关键字的较新的sql server转换为旧式ansi sql

时间:2013-05-09 17:25:29

标签: sql join ansi-sql

我们正在迁移到一个新的数据库平台Polyhedra,这是严格的旧式ANSI sql,没有“JOIN”这个词。如果它是sql server,我正在尝试做的事情:

SELECT A.* FROM tblA A LEFT JOIN tblB B ON A.f1 = B.f1
where B.f1 is NULL

我似乎无法重新创建将where连接放在where子句

中的位置

像:

select A.*
from tblA A, tblB B
where A.f1 = B.f1 AND B.f1 is null

显然,即使tblB为空,这也不会返回任何记录。知道如何完成这项工作吗?

2 个答案:

答案 0 :(得分:3)

您的查询实际上根本不需要加入。

SELECT  A.* 
FROM    tblA A 
WHERE   NOT EXISTS (SELECT 1 FROM tblB B WHERE A.f1 = B.f1);

我快速浏览了一下Polyhedra SQL参考手册(available here),看不到任何类似SQL的*=(+)的内容-Server和Oracle分别使用,我认为你可能不得不求助于LEFT JOIN这样你需要列的东西(据我所知,Polyhedra支持UNION):

SELECT  A.f1 AS A, b.f1 AS B
FROM    tblA A, tblB B
WHERE   A.f1 = B.f1
UNION ALL
SELECT  A.f1 AS A, NULL AS B
FROM    tblA A
WHERE   NOT EXISTS (SELECT 1 FROM tblB B WHERE A.f1 = B.f1);

Example on SQL Fiddle (Not in Polyhedra)

<强>附录

由于NOT EXISTS不被允许,但NOT IN是,

SELECT  A.f1 AS A, b.f1 AS B
FROM    tblA A, tblB B
WHERE   A.f1 = B.f1
UNION ALL
SELECT  A.f1 AS A, NULL AS B
FROM    tblA A
WHERE   A.F1 NOT IN (SELECT b.F1 FROM tblB B WHERE B.f1 IS NOT NULL);

有很多免费的DBMS,如果可能的话,我会强烈建议查看其他供应商。

答案 1 :(得分:0)

旧式LEFT OUTER JOIN语法为(* =)

试试这个:

select A.*
from tblA A, tblB B
where A.f1 *= B.f1
and B.f1 is null

但是现在它不是ANSI标准,从SQL Server 2005开始就被弃用