我希望根据表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
答案 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_a
与table_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