有没有办法让postgresql报告来自连接的结果?

时间:2012-07-20 18:51:49

标签: sql postgresql join

在其他统计软件(STATA)中,当您在两个单独的表之间执行连接时,可以选择报告连接的结果

例如,如果您将表与列上的另一个表连接在一起,而第二个表具有非唯一值,则会报告该值。

同样,如果执行内连接,它会报告从两个表中删除的行数,如果执行左外连接或右外连接,它会让您知道有多少行是不匹配的。

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

据我所知,在Postgres中没有选择这样做,尽管你可以通过查看估算来猜测。

计算丢失的行需要您计算所有行,因此数据库通常会尝试避免这类行为。

我能想到的选择:

  • 撰写多个查询
  • 进行完全外部联接并过滤结果(可能使用子查询......无法想到一个总能轻松工作的好方法)
  • 使用可写的复杂表表达式来记录中间结果