2017-03-15 84 views
0

嗨,我有两个表A和BA有6行,而b有7行。两个表在名称列中都有公共值。表中的所有6行都存在于b表中名称列。从表格子句中的两个表中选择结果

当我写查询select * from a,b其中a.name = b.name我得到14行返回我期待与结果中的6行的内部联接。

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

表A enter image description here

表B enter image description here

查询是 SELECT * FROM A,B其中a.tt = b.tt和a.nename = b.nename;

reuslt是 enter image description here

+0

为什么不使用标准连接语法? – thebjorn

+0

我可以但我只是问,当我们使用这样的查询会发生什么,它是一个完整的连接发生或在这里发生了什么? –

回答

-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

+1

加入将导致完全相同的记录数 –

+0

我的问题是在查询中发生了什么?我可以使用连接,但我想搁浅如何执行查询时,我使用这样的查询 –

+0

这样的查询select * from a,b其中a.tt = b.tt和a.nename = b.nename将采取一个记录从一个和将尝试匹配它的所有记录,并返回匹配和发生与a和b的所有行,因为你有重复的数据,它会返回错误的结果集 – YouKnowWhoIAm

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 
+0

我可以利用内部连接并获得结果,但我的问题是目前在这个查询中发生了什么,为什么14行将来 –

+0

@ Sunil Kumar,我想@Conrad Frix解释得非常好。当你进行连接时,对于'a'表中的每一行,它都会尝试在表'b'中找到匹配的行,如果你仔细分析你的表,你会发现。试试这个练习:从表'a'(基于'nename'和'tt')尝试找到表'b'中与表'a'中第一行相匹配的行,并打印这些行(在一张纸上),并为表格'a'中的每一行重复此操作。你会得到相同的结果。 – ahoxha