我已经在libpq上为PostrgreSQL创建了一个远程应用程序草案。它的性能很好,但是我已经介绍了该应用程序的一般功能。对于我产生的每个最终业务结果,碰巧都会调用40 select子句(通过tcpip)。

我对SQL Server怀有回忆,提醒我尽量减少远程之间的交互次数应用程序和数据库。分析了我的选择之后,我确实可以使用联接将这个数目减少到3个SELECT子句。但是我不记得在另一个SELECT中使用SELECT的结果的语法。

例如:

SELECT * FROM individual
INNER JOIN publisher
ON individual.individual_id = publisher.individual_id
WHERE individual.individual_id = 'here I would like to use the results of a another select'


这另一个SELECT会简而言之:

SELECT identifier FROM another_table WHERE something='something'


这里是简化的表格布局,针对不同的item_types拒绝了多次...(3种完全不同的类型,因此3 SQL查询(如果已优化)。

table passage
  id_passage PK
  business_field_passage bytea

table item
  id_item PK
  id_passage FK
  business_field_item text

table item_detail
  id_item_detail PK
  id_item FK
  business_field_item_detail text
  image_content bytea
一个id_item有多个id_passage
有多个id_item_detail一个id_item

如何写?
用于描述将一个选择重定向到另一个(如果有)的动作的名称是什么?

评论

postgresql.org/docs/9.1/static / ...

您是指7.2.1.3。子查询?

可能是的,还有JOIN部分。

#1 楼

这是您的目标吗?确保要比较的字段具有可比性(即,两个字段均为数字,文本,布尔值等)。

SELECT * FROM Individual
INNER JOIN Publisher
ON Individual.IndividualId = Publisher.IndividualId
WHERE Individual.IndividualId = (SELECT someID FROM table WHERE blahblahblah)


如果要基于多个值进行选择:

SELECT * FROM Individual
INNER JOIN Publisher
ON Individual.IndividualId = Publisher.IndividualId
WHERE Individual.IndividualId IN (SELECT someID FROM table WHERE blahblahblah)


评论


可以那样直接吗?如果从表SELECT someID FROM blahblahblah有多个记录,它仍然可以工作吗?我现在要检查一下。

–斯蒂芬·罗兰(Stephane Rolland)
13年1月25日在16:38

哪个查询正在选择多个记录?如果您选择多个记录,则可以使用此方法,但是如果您可以向我们展示您的表格布局,这将有助于我们优化答案。

–愤怒的斯巴达人
13年1月25日在16:40



在哪里Individual.IndividualId ...看起来不错。

–斯蒂芬·罗兰(Stephane Rolland)
2013年1月25日17:00

@StephaneRolland:非常明显,谢谢!

– Paul
19/12/20在21:03

#2 楼

您可以将其重写为另一个JOIN。通常这是最简单,最快的方法:

SELECT i.*, p.*
FROM   individual    i
JOIN   publisher     p USING (individualid)
JOIN   another_table a ON a.identifier = i.individualid
WHERE  a.something = 'something'


我也做了一些简化,并取消了无用的CamelCase标识符拼写。

评论


是的,这个。每当我看到IN(SELECT ..)语法时,我都会在里面死一些。

– Mark Storey-Smith
13年1月26日在12:56

@ MarkStorey-Smith您的意思是它比简单和快速还多:这是使用另一个联接而不是in(select ...)的sql编码标准。在这种情况下,我还应该将良好的答案归功于Erwin。

–斯蒂芬·罗兰(Stephane Rolland)
2013年1月26日19:27

@StephaneRolland是否更快取决于平台和版本。例如,SQL Server 2008+将为INNER JOIN和IN(SELECT ...)语法生成相同的执行计划。不知道是否同样适用于PostgreSql。除了性能,IN(SELECT ...)风格让我想知道作者是否已经完全掌握了SQL的语义和概念。 AngrySpartan已正确回答了您的原始问题。 ErwinBrandstetter已向您显示了应采取的方式:)。

– Mark Storey-Smith
2013年1月26日19:41



@ MarkStorey-Smith:JOIN并不总是等同于IN条件。问题不是哪个更快,问题是哪个正确。

– a_horse_with_no_name
2015年12月11日在11:48

我只掌握了部分SQL语义/概念。如果整个查询的IN(SELECT ...)部分中的SELECT语句返回多行,那么如何用JOIN替换“ IN(SELECT ...)”语法?

–Clovis_Sangrail
20年6月1日,0:50