Sql 一对一关系和连接where子句

Sql 一对一关系和连接where子句,sql,Sql,是否有人有一个非常好的例子,其中有两个表具有一对一的关系,其中使用表B作为目标进行左连接没有使用where子句仅使用表a作为目标进行左连接有用 Table A (ManyToOne with Table B) Pk Number Fk Table B Pk IsActive 我的意思是,我可以写一个这样的连接 select * from TableA as a left outer join TableB as b on b.pk=a.fk where b.isActive=false an

是否有人有一个非常好的例子,其中有两个表具有一对一的关系,其中使用表B作为目标进行左连接没有使用where子句仅使用表a作为目标进行左连接有用

Table A (ManyToOne with Table B)
Pk
Number
Fk

Table B
Pk
IsActive
我的意思是,我可以写一个这样的连接

select * from TableA as a left outer join TableB as b on b.pk=a.fk where b.isActive=false and a.Number < 15
但这不是无效的,因为b有许多a行,所以a.xxxx是无效的,因为它是一个列表,实际上只能是a.size,这将是该b行的a行列表中的行数

谢谢,
Dean

您的两个示例都是有效的内部联接

执行左外部联接时,第二个表中的值为NULL。您的WHERE条款是:

where b.isActive=false and a.Number < 15
其中b.isActive=false,a.编号<15
空值将导致此操作失败,删除从第二个表中添加的所有“虚拟”行

如果确实需要左外部联接,则需要在ON子句而不是WHERE子句中包含这些联接

Table A (ManyToOne with Table B)
Pk
Number
Fk

Table B
Pk
IsActive

一般来说,
A左外连接B
B左外连接A
是完全不同的。第一种方法保留A中的所有行,以及B中匹配的行(如果不匹配,则为空值)。第二个将所有行保留在B中,所有匹配的行都来自A(如果不匹配,则为NULL值)。

ah,我认为它将返回NULL行,并返回其中B.isActive=true的行。好的,所以我需要在(a.fk=null | | b.isActive=false)和&a.Number<15之间进行合并,或者,
合并(b.isActive,false=false和a.Number<15
。如果有PK-fk(主键/外键)表和联接之间的关系在PK-FK列上,FK表中不应该有任何与PK表不匹配的条目,因此以FK表作为主导表的左联接(联接的LHS)应该是无意义的(与常规联接相同).相反,PK表中可能有行,而FK表中没有相应的行;因此,将PK表作为主表进行左连接可能是有意义的。
where b.isActive=false and a.Number < 15