使用内部联接来减少结果。我是否需要在join语句之外的任何地方引用新表?

时间:2016-06-24 15:46:35

标签: sql-server oracle join

我想知道我是否可以将内连接作为where子句本身。或者,如果我在where子句中使用连接表中的字段,那么它是多余的。

    select * from T1   inner join T2   on T1.id = T2.id   where T2.z is not null

" T2.z是否为空"如果我想要返回的所有内容都是T1中的记录,其中T2中存在相同的id?

2 个答案:

答案 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.idT2.id将是其表的主键。

如果T1.idT1的主键,那么您的查询将返回重复项 - 每个T1行将针对{{1}中存在的每个子项重复一次}}

如果T2T2.id的主键,则您根本不需要加入T2,因为T2中必须存在T1.id值1}},因为(应该)存在的T2.id关系。在这种情况下,你可以写:

FOREIGN KEY

因此,您的问题的答案是您不需要在连接条件之外引用表格以便应用连接。但是对于这种方法似乎有些不太了解。