如何使用sql连接简化此查询?

时间:2013-03-23 05:45:01

标签: sql postgresql

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

我想要所有记录:

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

    我使用以下查询获得了令人满意的结果:

    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 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

您可以通过调用“SELECT distinct t2.id ...”

来获得截然不同的结果

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

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

执行内部联接的一种更简单的方法是理解上述查询的结果是另一个表,正式名称为relation。您可以将其视为加入同一个表,但更容易想到它的方法是“加入此查询的结果”。让我们来测试一下。

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;

如果第一个查询(名称='a_name'的所有行)都有很多结果,那么第二个查询很有可能存在重复,因为别名'a'和'other'之间的内部联接是他们的cross product

编辑:语法,清晰度

答案 2 :(得分:1)

您应该使用自联接而不是内部联接来看到这一点 http://msdn.microsoft.com/en-us/library/ms177490%28v=sql.105%29.aspx

答案 3 :(得分: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