Невозможно назначить псевдонимы через объединения в MS Access - PullRequest
0 голосов
/ 22 февраля 2019

Я пытаюсь создать список рассылки из таблицы в моей базе данных, затем найти столбец в этой таблице, который содержит информацию о братьях и сестрах, извлечь эту информацию о братьях и сестрах, найти этих братьев и сестер в таблице, а затем присоединить этих братьев и сестер коригинальный список рассылки.

В следующем коде я пытаюсь назначить псевдоним t1 для запроса выбора.

SELECT * FROM CountyData AS t1
WHERE dt_dec BETWEEN #05-6-2018# AND #06-06-2018# 
AND RippleImport IS NULL 
AND (Date()-[dob])/365.25 <13.875 

UNION SELECT CountyData.*
FROM CountyData INNER JOIN 

(SELECT TRIM(String_Split([Siblings], 0, ";")) FROM t1 WHERE Siblings IS NOT NULL
UNION
SELECT TRIM(String_Split([Siblings], 1, ";")) FROM t1 WHERE Siblings IS NOT NULL 
UNION
SELECT TRIM(String_Split([Siblings], 2, ";")) FROM t1 WHERE Siblings IS NOT NULL
UNION 
SELECT TRIM(String_Split([Siblings], 3, ";")) FROM t1 WHERE Siblings IS NOT NULL) t2

ON CountyData.[fname]&" "&[lname] = t2.[Expr1000] WHERE RippleImport IS NULL;

Когда я пытаюсь вызвать этот псевдоним на другой стороне первого объединения, я получаю следующее сообщение об ошибке.

'Microsoft Access database engine cannot find the input table or query 't1'. Make sure it exists and that its name is spelled correctly.' 

Как назначить псевдоним таблицы, который будет распознаваться во всем запросе?

1 Ответ

0 голосов
/ 22 февраля 2019

Следующее должно исправить использование псевдонимов в вашем коде:

select t1.* from countydata t1
where t1.dt_dec between #05-6-2018# and #06-06-2018# 
and t1.rippleimport is null 
and (date()-t1.dob)/365.25 <13.875 
union
select t1.* from countydata t1 inner join 
(
    select trim(string_split(t1.siblings, 0, ";")) as sib from countydata t1 where t1.siblings is not null
    union
    select trim(string_split(t1.siblings, 1, ";")) as sib from countydata t1 where t1.siblings is not null 
    union
    select trim(string_split(t1.siblings, 2, ";")) as sib from countydata t1 where t1.siblings is not null
    union 
    select trim(string_split(t1.siblings, 3, ";")) as sib from countydata t1 where t1.siblings is not null
) t2 on t1.fname & " " & t1.lname = t2.sib 
where t1.rippleimport is null;

Однако может быть более эффективно использовать вычисленные критерии соединения, например:

select t1.* from countydata t1
where t1.dt_dec between #05-6-2018# and #06-06-2018# 
and t1.rippleimport is null 
and (date()-t1.dob)/365.25 <13.875 
union
select t1.* 
from countydata t1 inner join 
(
    select t.siblings as s from countydata t where t.siblings is not null
) 
t2 on 
(
    t1.fname & " " & t1.lname = trim(string_split(t2.s, 0, ";")) or
    t1.fname & " " & t1.lname = trim(string_split(t2.s, 1, ";")) or
    t1.fname & " " & t1.lname = trim(string_split(t2.s, 2, ";")) or
    t1.fname & " " & t1.lname = trim(string_split(t2.s, 3, ";"))
)
where t1.rippleimport is null;

Вышеполностью не проверено.

...