#sql #ms-access #ms-access-2007
#sql #ms-access #ms-access-2007
Вопрос:
У меня есть база данных с таблицей, которая имеет идентификаторы c1, c2, c3 .. и т.д..
Вместо написания запроса, в котором есть множество OR
s, как я могу изменить приведенный ниже запрос чем-то, что будет перехватывать все записи, начинающиеся с определенной буквы?
SELECT
Person.spineinjuryAdmit,
tblComorbidity.comorbidityexplanation,
Count(tblComorbidity.comorbidityexplanation) AS CountOfcomorbidityexplanation
FROM tblKentuckyCounties
INNER JOIN (tblComorbidity
INNER JOIN (Person
INNER JOIN tblComorbidityPerson
ON Person.PersonID = tblComorbidityPerson.personID)
ON tblComorbidity.ID = tblComorbidityPerson.comorbidityFK)
ON tblKentuckyCounties.ID = Person.County
GROUP BY Person.spineinjuryAdmit,
tblComorbidity.comorbidityexplanation
HAVING (((Person.spineinjuryAdmit)="c1" Or
(Person.spineinjuryAdmit)="c2" Or
(Person.spineinjuryAdmit)="c3"));
Комментарии:
1.Я не уверен, предпочитаете ли вы делать это таким образом, но мне нравится создавать свои операторы join следующим образом:
FROM tblKentuckyCounties k
JOIN Person p ON p.County = k.ID
JOIN tblComorbidityPerson cp ON cp.personID = p.PersonID
JOIN tblComorbidity c ON c.ID = cp.comorbidityFK
Ответ №1:
Вы пробовали использовать LIKE
? В качестве примера:
SELECT * FROM patients WHERE lastName LIKE 'm%';
Это вернет записи, которые patients.lastName
начинаются с ‘m’. Символом ‘%’ может быть ‘*’ для access, я не помню. В некоторых базах данных вы также можете использовать ‘_’, который будет соответствовать одному символу (или сколько бы подчеркиваний вы ни добавили).
Комментарии:
1. я пытался использовать подстановочный знак%, но изначально сделал это неправильно, поэтому обратился к SO за некоторой помощью.
2. Традиционными подстановочными знаками Access (Jet / ACE) являются * и ?, использующий «Режим SQL ANSI 89 по умолчанию» (который является собственностью Access). % и _ — это ANSI 92 SQL, и вы можете запускать Access в режиме ANSI 92 SQL, но я бы не рекомендовал этого (это нарушает многие функции в приложении, созданном в режиме ANSI 89). В качестве альтернативы, если вы хотите использовать подстановочные знаки ANSI 92, вы можете использовать собственный оператор ALIKE или запустить свой SQL с OLEDB / ADO, который по умолчанию использует режим ANSI 92 (DAO использует ANSI 89).
Ответ №2:
SELECT Person.spineinjuryAdmit, tblComorbidity.comorbidityexplanation, Count(tblComorbidity.comorbidityexplanation) AS CountOfcomorbidityexplanation
FROM tblKentuckyCounties INNER JOIN (tblComorbidity INNER JOIN (Person INNER JOIN tblComorbidityPerson ON Person.PersonID = tblComorbidityPerson.personID) ON tblComorbidity.ID = tblComorbidityPerson.comorbidityFK) ON tblKentuckyCounties.ID = Person.County
GROUP BY Person.spineinjuryAdmit, tblComorbidity.comorbidityexplanation
HAVING (Person.spineinjuryAdmit LIKE "c*");
Комментарии:
1. будет принято, как только мне будет разрешено. я подумал, что задать SO будет быстрее, чем искать в Google. спасибо 🙂
Ответ №3:
Вы можете использовать предложение WHERE, чтобы исключить ненужные строки, прежде чем выполнять ГРУППИРОВКУ ПО.
SELECT
p.spineinjuryAdmit,
c.comorbidityexplanation,
Count(c.comorbidityexplanation) AS CountOfcomorbidityexplanation
FROM tblKentuckyCounties AS k
INNER JOIN (tblComorbidity AS c
INNER JOIN (Person AS p
INNER JOIN tblComorbidityPerson AS cp
ON p.PersonID = cp.personID)
ON c.ID = cp.comorbidityFK)
ON k.ID = p.County
WHERE p.spineinjuryAdmit ALike "c%"
GROUP BY p.spineinjuryAdmit,
c.comorbidityexplanation
Если ваш запрос выполняется в режиме SQL-89, вы можете использовать это в качестве вашего предложения WHERE .
WHERE p.spineinjuryAdmit Like "c*"
В режиме SQL-92 вам нужен стандартный шаблон ANSI.
WHERE p.spineinjuryAdmit Like "c%"
Я использовал ALike, чтобы указать ядру базы данных ожидать подстановочные знаки ANSI.
Режим SQL-89 используется DAO … если только вы не настроили параметр базы данных на использование режима SQL-92 («Синтаксис, совместимый с SQL Server»).
Если вы выполняете запрос с помощью ADO, он всегда будет использовать режим SQL-92.
Ответ №4:
Вы можете использовать regexp для запроса всех строк, которые начинаются с нескольких символов.
SELECT * FROM table WHERE column REGEXP '^[ c1, c2, c3]';
Этот запрос вернет все строки, где столбец начинается с ‘c1’, ‘c2’ или ‘c3’.
Ответ №5:
У вас есть два варианта:
Например:
Person.spineinjuryAdmit LIKE "c*"
Person.spineinjuryAdmit IN ("c1", "c2", "c3")
Смотрите http://office.microsoft.com/en-us/access-help/like-operator-HP001032253.aspx подробнее о LIKE.
Справедливое предупреждение: Подстановочными знаками LIKE в Access являются *
и ?
вместо %
и _
(как и в случае с большинством других версий SQL).
Ответ №6:
Вы могли бы изменить это, чтобы включить список фильтров в WHERE
предложение. Ниже будут найдены пациенты, фамилия которых начинается с Smith
. (т.е. Smith
и Smithson
и т.д.), и те, у кого Admit
начинается с c
.
....
WHERE spineinjuryAdmit LIKE 'c*'
AND Patient.FirstName LIKE 'Smith*'
GROUP BY Person.spineinjuryAdmit,
tblComorbidity.comorbidityexplanation;