【问题标题】:SQL Query where clause for multiple columns in same tableSQL查询同一张表中多列的where子句
【发布时间】:2021-10-20 09:34:39
【问题描述】:

拥有以下数据库:

尝试执行以下查询:

select * 
from data_five_minutes 
where ((open in (select open 
                 from data_five_minutes 
                 where date_time = '2019-01-02 13:15:00')) > 
        (open in (select open 
                  from data_five_minutes 
                  where date_time = '2019-01-01 11:10:00')))

上面的查询给了我 3 个结果,但我期待 0 个!

我尝试获取的是:- 获取 02/01 13:15 的开盘时间 > 01/01 11:10 开盘的行,两者的 script_id 相同。

【问题讨论】:

  • 我不确定投反对票的目的是什么,但通常是因为使用图像作为示例数据。
  • 02/01 13:15的开盘小于01/01 11:10的开盘。
  • 你的条件对我来说真的没有意义。它归结为where one_boolean_expression > other_boolean_expression,因为(open in (...)) 产生真或假,它不返回来自IN 运算符的子查询的值。
  • @forpas 是的,它应该给出 0 结果的原因。
  • @a_horse_with_no_name 对不起,我听不懂你,如果这是一种不好的执行查询类型,你能帮我举个与我的情况相关的例子吗?我会尝试从那里创建。

标签: sql postgresql date exists


【解决方案1】:

你可以使用EXISTS:

SELECT d1.* 
FROM data_five_minutes d1 
WHERE d1.date_time = '2019-01-02 13:15:00'
  AND EXISTS (
    SELECT 1
    FROM data_five_minutes d2
    WHERE d2.date_time = '2019-01-01 11:10:00'
      AND d2.script_id = d1.script_id
      AND d2.open < d1.open
  );

【讨论】:

  • 这有助于获取数据,但问题是当我在 900K+ 行中运行查询时,需要 5 分钟才能获取数据,并显示 17 行。只有 250 个脚本 ID
  • @Kabomi 返回的行满足您设置的条件,所以我对此无话可说。为了查询的性能,您可以在 date_time、script_id 和 open 上创建一个复合索引,这会有所帮助。
猜你喜欢
  • 2019-05-08
  • 1970-01-01
  • 2020-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-10
  • 1970-01-01
  • 2011-12-03
相关资源
最近更新 更多