我们正在迁移到一个新的数据库平台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为空,这也不会返回任何记录。知道如何完成这项工作吗?
答案 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开始就被弃用