在另一个SELECT的WHERE子句中使用SELECT


21

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

我对SQL Server的回忆使我想起尽量减少远程应用程序与数据库之间的交互次数。分析了我的选择之后,我认为可以SELECT使用联接将这个数目减少到3个子句。但是我不记得SELECT在另一个中使用a的结果的语法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

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



您是指7.2.1.3。子查询?
Stephane Rolland 2013年

可能是的,还有JOIN部分。
dezso 2013年

Answers:


30

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

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 table WHERE blahblahblah有多个记录,它仍然可以工作吗?我现在要检查一下。
Stephane Rolland

哪个查询正在选择多个记录?如果您要选择多个记录,它可以工作,但是如果您可以向我们展示您的表格布局,这将有助于我们完善答案。
愤怒的斯巴达

1
WHERE Individual.IndividualId IN...看起来不错。
Stephane Rolland 2013年

10

您可以将其重写为另一个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标识符拼写。


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

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

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

6
@ MarkStorey-Smith:JOIN并不总是等同于IN条件。问题不是哪个更快,问题是哪个正确。
a_horse_with_no_name 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.