1

我们正在迁移到一个新的数据库平台,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 子句中的位置

喜欢:

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

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

4

2 回答 2

3

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

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

我快速浏览了 Polyhedra SQL 参考手册(可在此处获得),并且看不到任何看起来与 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);

SQL Fiddle 示例(不在多面体中)

附录

因为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,如果可能的话,我强烈建议您查看其他供应商。

于 2013-05-09T18:01:47.853 回答
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 起已弃用

于 2013-05-09T17:40:55.610 回答