我试图实现2个连接。如果我单独运行第一个连接,则会得到4个结果,这是正确的。但是,当我添加使用select语句的结果查询同一引用表的第二个连接时,它会引入其他结果。请参照附件。不应返回平方部分
所以我删除了第二次加入以尝试更好地解释。见图2。我正试图获取另一个列,它针对初始引用表IRIS.Practice.idvClient查找InvolvedInternalID。
答案 0 :(得分:0)
您的数据库正在按照您的说法进行操作。当您添加第二个连接(在3个表查询中混淆为别名为tb1)时,数据库将查找符合连接的ON部分中的谓词/真实语句的匹配行
如果你不想要那些行,那么两件事中的一件必须是这样的:
1)您在ON子句中指定的真实性是错误的;例如说SELECT * FROM person INNER JOIN shoes ON person.age = shoes.size
是错误的 - 两个13岁的人和两个13号的鞋子会产生4个结果,鞋子尺寸与年龄无关
2)连接的表中有些行不适用于您要查找的结果,但是您忘记通过在ON中添加一些WHERE(或其他限制)子句来过滤它们。例如,一个表包含所有历史数据以及当前记录,当前记录是DeletedOn
列中具有NULL的记录。如果您忘记说WHERE deletedon IS NULL
,那么您的数据将会增加,因为所有过去的行都不适用于您的查询
不要使用tbX,tbY等对表进行别名。使名称有意义!像tbX这样的别名不仅与原始表名没有关系(所以你遇到tbX,然后必须搜索查询的其余部分以找到它所声明的位置,这样你就可以说“啊,这是地址表”)但是在这种情况下,你加入idvclient
两次,但给他们无用的别名,如tb1,tb3,当你真的应该用它们别名描述它们与其余查询表之间的关系
例如,ParentClient
和SubClient
或OriginatingClient
/ HandlingClient
是更好的名称,如果这些表格彼此存在某种关系。
无论两次加入此表的目的是什么,请将其与目的相关联。它可能使你所做的更容易被发现,例如“哦,当然......我错过了WHERE parentclient.type = 'parent'
”(或WHERE handlingclient.handlingdate is not null
等等。)
智慧的第一步是将事物称为正确的名称