#sql #ms-access #ms-access-2010
#sql #ms-access #ms-access-2010
Вопрос:
К сожалению, я думаю, что я довольно ограничен в том, какие решения я могу применить. Я делаю это для работы, и у меня есть только разрешения на ВЫБОР из таблиц через Access 2010. Я не могу обновлять или создавать таблицы. Я не могу найти полезную информацию, например, какая версия sql находится на серверной части, не говоря уже о прямом доступе к базе данных или использовании VBA.
Допустим, у нас есть такой набор данных (грубый вид, извините):
MemberID | StatusCd | Date Added
12345 | 200 | 08/01/2016
12345 | 300 | 09/01/2016
12345 | 400 | 10/01/2016
5646 | 400 | 10/01/2016
8946 | 100 | 07/01/2016
Теперь эта база данных огромна, и это будет огромной проблемой с производительностью, если я попытаюсь извлечь все элементы из таблицы и обработать ее впоследствии. Я хочу вернуть все строки, которые совместно используют MemberID, где по крайней мере одна строка для этого MemberID имеет значение StatusCd 300. Например, если бы мне нужна была информация о членах, достигших статуса 300, желаемая таблица выглядела бы так:
MemberID | StatusCd | Date Added
12345 | 200 | 08/01/2016
12345 | 300 | 09/01/2016
12345 | 400 | 10/01/2016
Однако прямо сейчас, когда я пытаюсь использовать команду SELECT, которая использует WHERE StatusCd = 300, я получаю только одну строку, в которой выполняется это условие. Я не знаю, будет ли это чему-либо мешать, но в настоящее время я соединяю эту таблицу с другой таблицей в MemberID, чтобы получить меньший, более релевантный набор таблиц для работы. Также было бы неплохо опустить строки, которые предшествуют StatusCd 300, но это небольшой фрагмент дополнительных данных, который не помешает оставить.
Спасибо за любую помощь, которую кто-либо может предоставить!
Редактировать: скорректированная формулировка на основе отзывов комментариев.
Комментарии:
1. Вопрос не очень понятен, все строки для элемента, где хотя бы 1 строка имеет statuscd 300?
select * from t where memberid in (select memberid from t where statuscd=300)
2. Правильно, как вы и сказали. Я посмотрю, смогу ли я обновить формулировку, тогда я попробую. Я действительно новичок в SQL, поэтому я даже не знал, что вы можете вложить такие выборки.
3. Вау, это сработало! Я не знаю, почему я не рассматривал возможность того, что я могу использовать SELECT для возврата значений, как с функцией на другом языке. Теперь, когда я это знаю, я посмотрю, смогу ли я поиграть с датами, чтобы получить что-то значимое. Если вы добавите свой комментарий в качестве ответа, я буду рад поблагодарить вас за ответ на мой вопрос. Большое спасибо!
Ответ №1:
Чтобы получить все строки для элемента, где по крайней мере 1 строка имеет statuscd
значение 300, сначала выберите все соответствующие memberid
с помощью подзапроса, затем выберите все с этим memberid
из таблицы:
select *
from t
where memberid in (
select memberid from t where statuscd = 300
)