1

新しいデータベース プラットフォームであるPolyhedraに移行しています。Polyhedraは、厳密に古い学校の ANSI sql であり、'JOIN' という単語はありません。SQLサーバーの場合、私がやろうとしていることは次のとおりです。

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 の例 (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 は数多くありますが、可能であれば、他のベンダーを検討することを強くお勧めします。

于 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 に答える