Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用sql联接简化此查询?_Sql_Postgresql - Fatal编程技术网

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

如何使用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

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')
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相同。