我有一个非常基本的LEFT OUTER JOIN来返回左表中的所有结果以及来自更大表的一些附加信息.左表包含4935条记录,但当我将其连接到另一个表时,记录计数明显更大.
据我所知,LEFT OUTER JOIN将返回左表中的所有记录,右表中的匹配记录和任何无法匹配的行的空值,这是绝对的福音,因此我的理解是它应该不可能返回比左表中存在的行更多的行,但它发生的一切都是一样的!
SQL查询如下:
SELECT SUSP.Susp_Visits.SuspReason, SUSP.Susp_Visits.SiteID
FROM SUSP.Susp_Visits LEFT OUTER JOIN
DATA.Dim_Member ON SUSP.Susp_Visits.MemID = DATA.Dim_Member.MembershipNum
Run Code Online (Sandbox Code Playgroud)
也许我在语法上犯了一个错误,或者我对LEFT OUTER JOIN的理解是不完整的,希望有人可以解释这是如何发生的?
后记
感谢你们给出了很好的答案,我对LEFT OUTER JOINS的理解现在要好得多,但是有人可以提出一种方法可以修改这个查询,这样我只能获得与左表中存在的记录一样多的记录吗?
此查询纯粹是为了生成报告,而重复的匹配只是简单地混淆了问题.
/后记
我有300多个班级.它们在某些方面有关系.
为简单起见,所有关系均为1:1.
这是一个示例图.
注意:对于某些情况,某些关系可能不存在.
例如,某些hen与任何内容无关food.
注2:没有链接=从不,例如每个egg都与任何相关cage.
永远不会添加/删除/查询这种关系.
如何优雅地存储它们之间的关系?
我的所有4个想法(下面)似乎都有缺点.
这是一个相关的问题,但是1:N只有1个关系.
这些是半伪代码.
我的第一个想法是互相添加指针.
Chick.h: -
class Egg;
class Food;
class Chick{ Egg* egg; Food* food;}
Run Code Online (Sandbox Code Playgroud)
Hen.h: -
class Egg; class Cage; class Food;
class Hen{ Egg* egg; Cage* cage; Food* food;}
Run Code Online (Sandbox Code Playgroud)
添加/删除关系和查询非常便宜,例如: -
int main(){
Hen* hen; ... Egg* egg=hen->egg;
}
Run Code Online (Sandbox Code Playgroud)
它运作良好,但随着我的程序的增长,我想要将它们分离.
粗略地说,Hen.h不应该包含单词Egg,反之亦然.
有很多想法,但似乎都没有.
我将展示每个解决方案的简短片段,然后总结问题末尾的利弊.
使用std::unordered_map.
它成为我程序的瓶颈.(在发布模式下配置)
class Egg{}; …Run Code Online (Sandbox Code Playgroud)