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

Ste*_*and 31 postgresql join select

我在 libpq 之上为PostrgreSQL制作了一个远程应用程序草案。它表现良好,但我已经描述了应用程序的一般功能。对于我产生的每个最终业务结果,我碰巧调用了类似 40 select 子句(通过 tcpip)的东西。

我有 SQL-Server 的回忆,提醒我尽量减少远程应用程序和数据库之间的交互次数。分析了我的选择后,我确实认为我可以SELECT使用连接将这个数字减少到 3 个子句。但我不记得SELECT在 another 中使用 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'
Run Code Online (Sandbox Code Playgroud)

另一个SELECT就是这样的:

SELECT identifier FROM another_table WHERE something='something'
Run Code Online (Sandbox Code Playgroud)

这是简化的表布局,针对不同的 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
Run Code Online (Sandbox Code Playgroud)

有几个id_item为一个id_passage
有几个id_item_detail为一个id_item

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

Ang*_*tan 41

这就是你的目标吗?确保被比较的字段是可比较的(即两个字段都是数字、文本、布尔值等)。

SELECT * FROM Individual
INNER JOIN Publisher
ON Individual.IndividualId = Publisher.IndividualId
WHERE Individual.IndividualId = (SELECT someID FROM table WHERE blahblahblah)
Run Code Online (Sandbox Code Playgroud)

如果您希望基于多个值进行选择:

SELECT * FROM Individual
INNER JOIN Publisher
ON Individual.IndividualId = Publisher.IndividualId
WHERE Individual.IndividualId IN (SELECT someID FROM table WHERE blahblahblah)
Run Code Online (Sandbox Code Playgroud)

  • `WHERE Individual.IndividualId IN ...` 看起来不错。 (3认同)

Erw*_*ter 12

您可以将其重写为另一个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'
Run Code Online (Sandbox Code Playgroud)

我还进行了一些简化,并取消了标识符的无缘无故的 CamelCase 拼写。

  • @MarkStorey-Smith:JOIN 并不总是等同于 IN 条件。问题不在于哪个更快,问题在于哪个正确。 (6认同)
  • 是的,这个。每当我看到 IN (SELECT ..) 语法时,我都会感到心碎。 (2认同)