sql选择'其中'在另一张桌子里

时间:2015-04-10 15:09:29

标签: php sql postgresql

我希望根据表B中的true或false选择在表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

5 个答案:

答案 0 :(得分:4)

您可以使用EXISTS:

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

答案 1 :(得分:3)

一种方法是使用in

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

答案 2 :(得分:2)

使用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_atable_b匹配时,此查询都会从date返回同一行比今天更大。另一种选择是使用GROUP BY代替,如果您想要进行某些汇总报告,例如GROUP BY a.id, a.event, a.name。但是,由于您没有进行任何汇总报告(例如特定日期或其他事件的计数),DISTINCT应该更清楚,更快地完成工作。

答案 3 :(得分:0)

使用JOIN即可:

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

答案 4 :(得分:0)

尝试此请求

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