从form子句中的两个表中选择结果

时间:2017-03-15 17:41:11

标签: sql postgresql

嗨我有两个表A和B.A有6行,b有7行。两个表在名称列中都有共同的值。表中的所有6行都存在于名称列的b表中。

当我编写查询select * from a,b where a.name = b.name i得到14行返回时我期待结果中有6行的内连接。

如果我们在表单子句中有两个表,请解释一下查询是如何工作的。

表A. enter image description here

表B. enter image description here

查询是 select a from a,b其中a.tt = b.tt和a.nename = b.nename;

重申是的 enter image description here

2 个答案:

答案 0 :(得分:1)

您在两个表格中都有重复项(除了{2, 2017-03-04 03:00:00}有三个副本),这就是为什么您得到14 =(2 * 4)+(2 * 3)。

很难理解重复数据。当它在连接的两侧复制时,它甚至更难做到。

您可以执行类似

的操作
With fixedA (SELECT 
               *, 
               row_number() over (partition by nename, tt order by nename) rn 
             FROM 
                A),
     fixedb (SELECT 
               *, 
               row_number() over (partition by nename, tt order by nename) rn 
             FROM 
                B)
      SELECT * 
      FROM fixedA a  full outer join  fixedb  b
           on a.neName = b.neName
             and a.tt = b.tt
             and a.rn = b.rn

然而,这将留下一个B记录带有空记录

row_number似乎也做了cellID所做的事情,所以你可以做到

SELECT * 
          FROM a  full outer join  b
               on a.neName = b.neName
                 and a.tt = b.tt
                 and a.cellID = b.cellID

答案 1 :(得分:-1)

你应该在那张桌子上做类似全外连接的事情你需要结果集我会建议这样的事情

select * from a full outer join b on a.tt = b.tt and a.nename=b.nename;

如果您处理更大的数据集加入数据类型(如varchar),则可能需要花费大量时间来加载结果集,这是因为比较。因此,最好使用外键或主键连接

https://www.w3schools.com/sql/sql_join_full.asp