2015-04-10 3 views
1

Я хочу, чтобы получить несколько строк в таблице А на основе истинного или ложного выбора на таблице В.SQL SELECT с «где» в другой таблице

ТАБЛИЦА 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 

Я хочу, чтобы выбрать только событие в таблице А, что его в определенную дату диапазона на столе в

что-то вроде

SELECT * FROM tableA WHERE date > today in tableB 
+2

Используйте ['JOIN'] (http://www.postgresql.org/docs/current/static/tutorial-join.html) – kero

+0

, если я использую joi n i будет получать строку в таблице, повторяющуюся, для которой строка таблицы b –

+1

@lambaoalfaex вы можете обновить свой вопрос, чтобы добавить запрос JOIN, который вы пытались, и тот, который не работает? – Maximus2012

ответ

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 

Буквально пару замечаний о других методах ргороз ed:

Использование 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 должен выполнить работу более четко и быстро.

+0

Это вернет строку для каждой записи в 'table_b' не одну запись из' table_a' ... если вы не добавите 'DISTINCT' или' GROUP BY'; например 'SELECT DISTINCT table_a. * ...' – CD001

+0

Спасибо, позвольте мне исправить это. –

+0

Почему бы просто не использовать 'WHERE' для сравнения даты? «Двигатель» может оптимизировать это сам по себе. – alexis

4

Вы можете использовать EXISTS:

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

Один из способов заключается в использовании in:

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

Привет @ gordon-linoff Ваше решение подходит мне, я не знал об IN, но просто помог мне что-то понять, я в руководстве postgres, но не ясно. У меня есть один идентификатор Проверка против 5 других идентификаторов, поэтому я думаю, что он это делает. ID 4585 (ложь) ID 4585 (правда) ID 4585 (правда) ID 4585 (ложь) ID 4585 (правда) почему использование IN Dont повторить линию как EXISTS или JOIN? –

+0

@lambaoalfaex. , , Ни 'EXISTS', ни' IN' не производят повторяющиеся строки, потому что они находятся в предложении 'WHERE'. 'JOIN' может создавать дубликаты, если между таблицами существует несколько совпадений. –

0

Использование JOIN вы можете сделать это:

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

Является тем же методом, я только начал писать свой ответ до того, как кто-то отправил сообщение, когда я закончил, я только что увидел другие ответы. –

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

+1

Есть ли у postgres GETDATE()? –

+0

Нет, в postgres вместо этого есть current_date! –

+0

Затем вы должны изменить его. Этот вопрос помечен postgres, а не сервером sql. – paqogomez

Смежные вопросы