Я пытаюсь использовать внутреннее объединение sql критериев двух столбцов из одной таблицы в базе данных доступа MS, и мне нужен только один запрос sql.
Пожалуйста, направь меня
Спасибо
SELECT PERSON.IDPERSON, MASTERPERSON.PERSONNAME, PERSON.[DATE], MASTERPERSON.LOCATION, FORMAT(PERSON.DATE,'dddd') AS DAYS
FROM PERSON INNER JOIN MASTERPERSON ON PERSON.IDPERSON = MASTERPERSON.IDPERSON;
Результат из Sql выше:
Стол PERSON
Стол MASTERPERSON
Стол PERSONDAYS
Желаемый результат


Похоже, нужен еще один JOIN для включения таблицы PersonDays. Это потребует составного JOIN в полях «Местоположение» и «Дата/Дни». Access требователен к использованию круглых скобок с несколькими предложениями JOIN. Используйте конструктор запросов, чтобы получить правильный синтаксис.
В вашем случае необходимо вычислить название дня из значения даты для ПРИСОЕДИНЕНИЯ к названиям дней. К сожалению, невозможно ПРИСОЕДИНИТЬСЯ напрямую к расчетному значению в представлении дизайна. Можно переключиться на представление SQL, чтобы добавить это дополнительное ПРИСОЕДИНЕНИЕ AND PersonDays.DAYS = FORMAT(PERSON.DATE, 'dddd'), но тогда его невозможно открыть в представлении дизайна.
SELECT Person.IDPerson, MasterPerson.PersonName, Person.Date, MasterPerson.Location, PersonDays.Days, PersonDays.Status
FROM PersonDays INNER JOIN (Person INNER JOIN MasterPerson
ON Person.IDPerson = MasterPerson.IDPerson)
ON PersonDays.Location = MasterPerson.Location AND PersonDays.DAYS = FORMAT(PERSON.DATE, 'dddd');
В противном случае создайте объект запроса, который вычисляет поле с помощью Format([Date],'dddd'), а затем используйте этот запрос в другом запросе, чтобы представление дизайна могло отображать соединение.
Альтернативой является использование предложения WHERE для этого дополнительного критерия связи. Дает тот же результат и может отображаться в представлении «Дизайн», но может работать менее эффективно.
SELECT Person.IDPerson, MasterPerson.PersonName, Person.Date, MasterPerson.Location, PersonDays.Days, PersonDays.Status
FROM PersonDays INNER JOIN (Person INNER JOIN MasterPerson
ON Person.IDPerson = MasterPerson.IDPerson)
ON PersonDays.Location = MasterPerson.Location
WHERE PersonDays.DAYS = FORMAT(PERSON.DATE, 'dddd');
Спасибо за ваш идеальный ответ, извините, что ответил поздно
Create table #PERSON
(IDPERSON INT ,DATE Date)
insert into #PERSON values
(1000, '29-May-24'),
(1000, '30-May-24'),
(1001, '29-May-24'),
(1001, '30-May-24')
create table #MASTERPERSON
(
IDPERSON int, PERSONNAME varchar(25), LOCATION varchar(5))
insert into #MASTERPERSON
values (
1000, 'Rey', 'A'),
(1001, 'Michael', 'B')
create table #PERSONDAYS(
LOCATION varchar(5) ,DAYS varchar(50), STATUS varchar(20) )
insert into #PERSONDAYS values
('A', 'Wednesday', 'A10'),
('A', 'Thursday', 'A27'),
('B', 'Wednesday', 'B18'),
('B', 'Thursday', 'B29')
select * from #PERSON
select * from #MASTERPERSON
select * from #PERSONDAYS
select p.IDPerson, m.PersonName, p.Date, m.Location, pd.Days, pd.Status
from #PERSON as p inner join #MASTERPERSON as m
on p.IDPERSON = m.IDPERSON
inner join #PERSONDAYS as pd on m.LOCATION = pd.LOCATION AND pd.DAYS = FORMAT(p.DATE, 'dddd')
Привет @LokeshK! Добро пожаловать в Stack Overflow. Простите, если я ошибаюсь, но ваш ответ, похоже, представляет собой код SQL, а не MS Access. Я не верю, что MS Access поддерживает временные таблицы. Кроме того, полезно предоставить объяснение вместе с дампом кода. Вот набор рекомендаций по предоставлению хорошего ответа: stackoverflow.com/help/how-to-answer Помните, что вы можете редактировать свой ответ и предоставлять подробную информацию.
Похоже, вам просто нужно еще раз присоединиться
JOIN PERSONDAYS AS pd ON pd.LOCATION = MASTERPERSON.LOCATION AND pd.DAYS = FORMAT(PERSON.DATE, 'dddd')