7

我正在运行一个查询,其中包含在一个子句中多次使用的相同子查询。WHERE

我有一张有两个字段的表client_idbuyer_id

子查询返回要从结果中排除的日期列表。

这就是我使用它的方式。

SELECT
  id, client_id, buyer_id
FROM relation
WHERE
  client_id NOT IN (SELECT <some_id> FROM <some_table> WHERE ...)
  AND buyer_id NOT IN (SELECT <some_ids> FROM <some_table> WHERE ...)

这按预期工作,但令我困扰的是有两个相同的子查询。我想知道是否有一种方法可以让我使用一次并将结果用于两个地方。

谢谢。

4

4 回答 4

3

你可以这样写NOT EXISTS

SELECT
    id, client_id, buyer_id
FROM relation AS r
WHERE NOT EXISTS
      ( SELECT 1 
        FROM <some_table> 
        WHERE (r.client_id = <some_id> OR r.buyer_id = <some_id>) 
          AND ...
      ) ;
于 2013-06-12T11:51:24.473 回答
1

表格查询:

select ...
from <main query>
where <select field> not in (select <subquery field> from <subquery>)

通常可以重新表述为:

select <main query fields>
from <main query>
left join <subquery> on <select field> = <subquery field>
where <subquery field> is null

如果您使用的子查询对于client_id 和buyer_id完全相同,则应该可以将您的查询重新表述为:

SELECT id, client_id, buyer_id
FROM relation
LEFT JOIN <some_table> ON <some_id> IN (client_id, buyer_id)
WHERE <some_id> IS NULL

- 因此在查询中只有效地使用子查询一次。

于 2013-06-12T11:39:41.593 回答
0

您的查询可以转换如下:

SELECT
  id, client_id, buyer_id
FROM relation
LEFT JOIN some_table
) AS subquery ON ( subquery.some_id IN (client_id, buyer_id) AND <condition that was in your subquery>)
WHERE subquery.some_id IS NULL;

但我觉得这在执行时间方面仍然会表现得很差。

考虑构建一个临时表来保存子查询的内容。

于 2013-06-12T11:40:02.667 回答
0

尝试将获取的值放入单独的数据库表中会有所帮助,这样当您已经将结果放在单独的表中时,现在可以确定是否存在相似的结果值或不同的值。等待听到你的诉讼......祝你好运。

于 2013-06-12T11:46:45.910 回答