嗨,我有两个表A和BA有6行,而b有7行。两个表在名称列中都有公共值。表中的所有6行都存在于b表中名称列。从表格子句中的两个表中选择结果
当我写查询select * from a,b其中a.name = b.name我得到14行返回我期待与结果中的6行的内部联接。
请解释一下当我们在form子句中有两个表时,查询是如何工作的。
查询是 SELECT * FROM A,B其中a.tt = b.tt和a.nename = b.nename;
嗨,我有两个表A和BA有6行,而b有7行。两个表在名称列中都有公共值。表中的所有6行都存在于b表中名称列。从表格子句中的两个表中选择结果
当我写查询select * from a,b其中a.name = b.name我得到14行返回我期待与结果中的6行的内部联接。
请解释一下当我们在form子句中有两个表时,查询是如何工作的。
查询是 SELECT * FROM A,B其中a.tt = b.tt和a.nename = b.nename;
你应该做一些像全外连接在您需要的结果,距离我建议这样的事情
select * from a full outer join b on a.tt = b.tt and a.nename=b.nename;
如果你处理的是一个更大的数据表设置像varchar这样的数据类型连接可能需要花费很多时间才能加载结果集。因此,这将是更好地使用外键或主键连接
加入将导致完全相同的记录数 –
我的问题是在查询中发生了什么?我可以使用连接,但我想搁浅如何执行查询时,我使用这样的查询 –
这样的查询select * from a,b其中a.tt = b.tt和a.nename = b.nename将采取一个记录从一个和将尝试匹配它的所有记录,并返回匹配和发生与a和b的所有行,因为你有重复的数据,它会返回错误的结果集 – YouKnowWhoIAm
你两个表(除了{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
我可以利用内部连接并获得结果,但我的问题是目前在这个查询中发生了什么,为什么14行将来 –
@ Sunil Kumar,我想@Conrad Frix解释得非常好。当你进行连接时,对于'a'表中的每一行,它都会尝试在表'b'中找到匹配的行,如果你仔细分析你的表,你会发现。试试这个练习:从表'a'(基于'nename'和'tt')尝试找到表'b'中与表'a'中第一行相匹配的行,并打印这些行(在一张纸上),并为表格'a'中的每一行重复此操作。你会得到相同的结果。 – ahoxha
为什么不使用标准连接语法? – thebjorn
我可以但我只是问,当我们使用这样的查询会发生什么,它是一个完整的连接发生或在这里发生了什么? –