我想知道我是否可以将内连接作为where子句本身。或者,如果我在where子句中使用连接表中的字段,那么它是多余的。
select * from T1 inner join T2 on T1.id = T2.id where T2.z is not null
" T2.z是否为空"如果我想要返回的所有内容都是T1中的记录,其中T2中存在相同的id?
答案 0 :(得分:0)
首先,select * from t1 inner join t2 [...]
不会返回t1
中的记录 - 它会返回t1
和 t2
的所有列。您可以通过专门选择t1
中的列来解决这个问题 - 不要select *
。
然后,如果t2
中有许多行具有相同的t2.id
,匹配给定的t1.id
,那么您将在结果中得到一大堆行输入t1
。所以你不会总是“减少”结果集。
似乎您可以使用in
运算符实现您想要的功能,例如
select * from t1 where t1.id in (select id from t2);
这相当于您的查询的以下修改。您不需要where
条款才能实现此目的:
select t1.* from t1 inner join (select distinct id from t2) b on t1.id = b.id;
答案 1 :(得分:0)
在以下查询中
select t1.* from T1 inner join T2 on T1.id = T2.id where T2.z is NOT null
WHERE
条件是多余的,假设T2.Z是NOT NULL
列。
那会让你知道:
select t1.* from T1 inner join T2 on T1.id = T2.id
,这有点奇怪,因为在正常设计的数据库中,T1.id
或T2.id
将是其表的主键。
如果T1.id
是T1
的主键,那么您的查询将返回重复项 - 每个T1
行将针对{{1}中存在的每个子项重复一次}}
如果T2
是T2.id
的主键,则您根本不需要加入T2
,因为T2
中必须存在T1.id
值1}},因为(应该)存在的T2.id
关系。在这种情况下,你可以写:
FOREIGN KEY
因此,您的问题的答案是您不需要在连接条件之外引用表格以便应用连接。但是对于这种方法似乎有些不太了解。