0

my_table 有 4 列:id integer, value integer, value2 integer, name character varying

我想要所有的记录:

  1. 与名称为“a_name”的记录具有相同的 value2
  2. 具有低于名称为“a_name”的记录的字段值

通过以下查询,我得到了令人满意的结果:

select t.id 
from my_table as t
where  t.value < ( select value from my_table where name = 'a_name')
and s.value2 = (select value2 from my_table where name = 'a_name');

但是是否可以使用 sql 连接来简化此查询?

在我看来,在同一张桌子上加入仍然太复杂了。我试着用这个例子来理解。

到目前为止,我所尝试的结果是重复的:

select t2.id 
from my_table as t
inner join my_table as t2 on t2.value2 = t.value2
where t2.value < ( select value from my_table where name = 'a_name');
4

4 回答 4

2

我认为这将解决您的问题。

select t1.id
from my_table as t1
join my_table as t2 
  on t1.value2 = t2.value2
  and t2.name = 'a_name'
  and t1.value < t2.value
于 2013-03-23T06:05:02.827 回答
1

您始终可以通过调用“SELECT distinct t2.id ...”获得不同的结果

但是,这不会增强您对内部连接的理解。如果您愿意,请继续阅读。让我们首先获取 name = 'a_name' 的所有记录。

SELECT a.*
FROM my_table as a
WHERE a.name = 'a.name';

执行内部连接的一种更简单的方法是了解上述查询的结果是另一个表,正式称为关系。您可以将其视为连接同一张表,但更简单的方式是将其视为“连接此查询的结果”。让我们来测试一下。

SELECT other.id
FROM my_table as a,
INNER JOIN my_table as other ON other.value2 = a.value2
WHERE a.name = 'a_name'
AND other.value < a.value;

如果第一个查询(name = 'a_name' 的所有行)有很多结果,那么第二个查询很可能有重复,因为别名 'a' 和 'other' 之间的内部连接是它们的叉积的子集.

编辑:语法,清晰度

于 2013-03-23T06:08:17.940 回答
1

您应该使用自联接而不是内部联接,请参阅此 http://msdn.microsoft.com/en-us/library/ms177490%28v=sql.105%29.aspx

于 2013-03-23T06:08:56.133 回答
0

请试试这个

select t.id 
from my_table as t
inner join
(select value from my_table where name = 'a_name')t1 on t.value<t1.value
inner join 
(select value2 from my_table where name = 'a_name')t2 on t.value2=t2.value2
于 2013-03-23T06:01:13.553 回答