如何使用sql联接简化此查询?
my_表有4列:id integer、value integer、value2 integer、name character variable 我想要所有的记录: 与名称为“a_name”的记录具有相同的值2 字段值低于名称为“a_name”的记录的字段值 通过以下查询,我得到了令人满意的结果:如何使用sql联接简化此查询?,sql,postgresql,Sql,Postgresql,my_表有4列:id integer、value integer、value2 integer、name character variable 我想要所有的记录: 与名称为“a_name”的记录具有相同的值2 字段值低于名称为“a_name”的记录的字段值 通过以下查询,我得到了令人满意的结果: select t.id from my_table as t where t.value < ( select value from my_table where name = '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');
请试试这个
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
请试试这个
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
我想这会解决你的问题
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
我想这会解决你的问题
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
通过调用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'之间的内部联接是它们的一个子集
编辑:语法、清晰度通过调用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'之间的内部联接是它们的一个子集
编辑:语法,清晰您应该使用自连接而不是内部连接参见此
您应该使用自联接而不是内部联接参见此
查看第一个查询,对于具有相同值的每组记录2,它删除了具有最大t值的记录?如果您在表中显示示例数据,然后显示示例所需的结果,这会很好。查看第一个查询,对于具有相同值的每组记录2,它会删除具有最大t值的记录?如果您在表中显示示例数据,然后显示示例所需的结果,那就太好了。JOIN与internal JOIN相同。JOIN与internal JOIN相同。