相关疑难解决方法(0)

LEFT OUTER JOIN如何返回比左表中存在的更多记录?

我有一个非常基本的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的理解现在要好得多,但是有人可以提出一种方法可以修改这个查询,这样我只能获得与左表中存在的记录一样多的记录吗?

此查询纯粹是为了生成报告,而重复的匹配只是简单地混淆了问题.

/后记

sql t-sql sql-server sql-server-2005

146
推荐指数
9
解决办法
18万
查看次数

在各种类型的对象之间存储许多关系1:1:去耦和高性能

我有300多个班级.它们在某些方面有关系.

为简单起见,所有关系均为1:1.
这是一个示例图.

在此输入图像描述 (在实际情况中,大约有50个关系对.)

注意:对于某些情况,某些关系可能不存在.
例如,某些hen与任何内容无关food.

注2:没有链接=从不,例如每个egg都与任何相关cage.
永远不会添加/删除/查询这种关系.

题:

如何优雅地存储它们之间的关系?
我的所有4个想法(下面)似乎都有缺点.

是一个相关的问题,但是1:N只有1个关系.

我糟糕的解决方案

这些是半伪代码.

版本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,反之亦然.

有很多想法,但似乎都没有.
我将展示每个解决方案的简短片段,然后总结问题末尾的利弊.

版本2哈希映射

使用std::unordered_map.
它成为我程序的瓶颈.(在发布模式下配置)

class Egg{}; …
Run Code Online (Sandbox Code Playgroud)

c++ database one-to-one relationship c++14

13
推荐指数
1
解决办法
679
查看次数