2

他の統計ソフトウェア (STATA) では、2 つの別々のテーブル間で結合を実行するときに、結合の結果を報告するオプションがあります。

たとえば、ある列でテーブルを別のテーブルと結合し、2 番目のテーブルに一意でない値がある場合、それが報告されます。

同様に、内部結合を実行すると、両方のテーブルから削除された行の数が報告され、左または右の外部結合を実行すると、一致しなかった行の数がわかります。

4

2 に答える 2

1

厄介な外部結合が必要になります。CTE バージョンは次のとおりです。

-- Some data
CREATE TABLE bob
        ( ID INTEGER NOT NULL
        , zname varchar
        );
INSERT INTO bob(id, zname) VALUES
 (2, 'Alice') ,(3, 'Charly')
,(4,'David') ,(5, 'Edsger') ,(6, 'Fanny')
        ;
CREATE TABLE john
        ( ID INTEGER NOT NULL
        , zname varchar
        );
INSERT INTO john(id, zname) VALUES
 (4,'David') ,(5, 'Edsger') ,(6, 'Fanny')
,(7,'Gerard') ,(8, 'Hendrik') ,(9, 'Irene'), (10, 'Joop')
        ;

 --
 -- Encode presence in bob as 1, presence in John AS 2, both=3
 --
WITH flags AS (
        WITH b AS (
                SELECT 1::integer AS flag, id
                FROM bob
                )
        , j AS (
                SELECT 2::integer AS flag, id
                FROM john
                )
        SELECT COALESCE(b.flag, 0) + COALESCE(j.flag, 0) AS flag
        FROM b
        FULL OUTER JOIN j ON b.id = j.id
        )
SELECT flag, COUNT(*)
FROM flags
GROUP BY flag;

結果:

CREATE TABLE
INSERT 0 5
CREATE TABLE
INSERT 0 7
 flag | count 
------+-------
    1 |     2
    3 |     3
    2 |     4
(3 rows)
于 2012-07-21T12:44:51.643 に答える
0

私の知る限り、Postgres内でそれを行うオプションはありませんが、見積もりを見れば推測できます。

欠落している行を計算するには、すべての行をカウントする必要があるため、データベースは通常、そのようなことを避けようとします。

私が考えることができるオプション:

  • 複数のクエリを書く
  • 完全外部結合を実行し、結果をフィルタリングします(おそらく、サブクエリを使用して...常に簡単に機能する良い方法を考えることはできません)
  • 書き込み可能な複雑なテーブル式を使用して、中間結果をログに記録します
于 2012-07-20T18:59:16.443 に答える