【问题标题】:sql select with 'where' in another table在另一个表中使用“where”进行sql选择
【发布时间】:2015-04-10 15:09:28
【问题描述】:

我想根据表 B 上的真假选择来获取表 A 中的一些行。

表A

id    event     name
4585  meeting   calendar discussion

表 B

id    idevent   date
534   4585      15/02/2015
535   4585      16/02/2015
536   4585      17/02/2015
537   4585      18/02/2015
538   4585      19/02/2015

我只想选择表 A 中的事件,它在表 B 上的特定范围日期内

类似

SELECT * FROM tableA WHERE date > today in tableB

【问题讨论】:

  • 使用JOIN
  • 如果我使用join,我会得到表a中的行重复表b的哪一行
  • @lambaoalfaex 您能否更新您的问题以添加您尝试过的 JOIN 查询和无效的查询?
  • @Maximus2012 我已经尝试了很多东西,所以我删除了所有内容,我来堆栈 XD 询问

标签: php sql postgresql


【解决方案1】:

您可以使用 EXISTS:

SELECT *
FROM TableA
WHERE EXISTS (SELECT * FROM TableB
              WHERE TableA.id = TableB.idevent
                    AND TableB.Date>current_date)

【讨论】:

    【解决方案2】:

    一种方法是使用in:

    SELECT a.*
    FROM tableA a
    WHERE a.idEvent IN (SELECT idEvent FROM tableB b WHERE b.date > current_date);
    

    【讨论】:

    • 嗨@gordon-linoff 你的解决方案非常适合我,我不知道IN,但只是帮助我理解一些东西,我在postgres手册上搜索过,但不清楚。我有一个 id 检查其他 5 个 id,所以我认为他正在这样做。 id 4585 ( false ) id 4585 ( true ) id 4585 ( true ) id 4585 ( false ) id 4585 ( true ) 为什么使用 IN 不要重复 EXISTS 或 JOIN 这样的行?
    • @lambaoalfaex 。 . . EXISTSIN 都不会产生重复的行,因为它们位于 WHERE 子句中。 JOIN 可以在表之间有多个匹配时产生重复。
    【解决方案3】:

    使用INNER JOIN

    SELECT DISTINCT a.*
    FROM table_a a
    INNER JOIN table_b b
    ON a.id = b.idevent AND b.date > CURRENT_DATE
    

    只是对提出的其他方法的一些评论:

    使用EXISTS 可能比IN 更可取,但Postgres 可能会将它们视为等价的。我知道在 SQL Server 中有时会发生这种情况 - 唯一的其他问题是 b.date 是否为 NULLABLE,这可能会在使用 IN 时导致意外行为。

    ON 条件中使用您的条件而不是WHERE 子句会更好,因为它有助于引擎知道在返回行以运行WHERE 过滤器之前排除行。

    我在这里使用DISTINCT,因为否则,每次table_b 中出现date 大于今天的匹配时,此查询都会从table_a 返回同一行。如果您想做一些汇总报告,例如GROUP BY a.id, a.event, a.name,另一种选择是使用GROUP BY。但是,由于您没有进行任何汇总报告(例如特定日期的事件计数等),DISTINCT 应该可以更清晰、更快速地完成工作。

    【讨论】:

    • 这将为table_b 中的每条记录返回一行,而不是来自table_a 的单个记录...除非您添加DISTINCTGROUP BY;例如SELECT DISTINCT table_a.* ...
    • 谢谢,让我解决这个问题。
    • 为什么不直接使用WHERE 进行日期比较? “引擎”可以自行优化。
    • @alexis 在回答中解释-如果可能的话,通常最好限制连接而不是限制连接的结果
    • 嗨@DanField 使用您的方法,我可以获得与 Gordon 的解决方案相同的结果。并使用“解释分析”进行多次测试,总运行时间的差异非常小。我将这两个建议都保存在我的 SQL 资源中。非常感谢
    【解决方案4】:

    使用JOIN 你可以这样做:

    SELECT 
         *
    FROM 
         tableA
    JOIN 
         tableB ON (tableA.id = tableB.idevent)
    WHERE 
         tableB.date > YOUR_TODAY_DATE;
    

    【讨论】:

    • 是同样的方法,我刚开始写我的答案在任何人发布之前,当我完成时我才看到其他答案。
    【解决方案5】:

    试试这个请求

    Select Current_date AS today , event 
    from A,B
    where A.id = B.idevent
    and B.date > today
    

    今天将采用当前系统日期 您可以查看此链接以获取更多信息: http://www.postgresql.org/docs/9.1/static/functions-datetime.html

    【讨论】:

    • postgres 有 GETDATE() 吗?
    • 不,在 postgres 中有 current_date 代替!
    • 那么你应该改变它。这个问题被标记为 postgres,而不是 sql server。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-19
    • 2012-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多