2012-07-20 80 views
2

在其他统计软件(STATA),当您执行两个独立的表之间的连接有选择报道的结果加入有没有办法让postgresql报告连接的结果?

举例来说,如果你在一列,第二个连接与其它表的表表具有非唯一值,它报告。

同样,如果执行内部联接它报告的行数两个表中丢弃,如果执行左或右外连接可以让您知道有多少行是无法比拟的。

回答

0

据我所知是没有选择这样做的Postgres内,虽然你可以通过查看估计得到一个猜测。

计算丢失行要求你计算所有行,以便数据库通常尽量避免这样的事情。

我能想到的选择:

  • 写多个查询
  • 做了充分的外部联接和过滤结果(可能与子查询......想不出一个好办法这将总是很容易的工作)
  • 使用可写复杂的表表达式来记录中间结果
+0

好难过!我希望SQL会假设自己:) – 2012-07-21 03:59:26

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) 
相关问题