2013-10-14 2 views
0

Следующий запрос MS Access 2010 выводит значения для FirstName, HomePhone и ClientNumber. Он не выводит никаких значений для LastName.Отсутствующее поле во вложенном выражении SQL в ms access 2010

Может ли кто-нибудь показать мне, как изменить его так, чтобы он также выводил значения для LastName?

SELECT 
    ActiveCustomers.FirstName 
, ActiveCustomers.LastName 
, tblClientAddress.HomePhone 
, ActiveCustomers.ClientNumber 
FROM (
    SELECT 
    Clients.ClientNumber 
    , Clients.FirstName 
    , Clients.LastName (
     SELECT COUNT(ReferralDate) FROM IntakeTable 
     WHERE Clients.ClientNumber = IntakeTable.ClientNumber 
     AND Len(ReferralDate & '') > 0 
    ) AS IntakeCount 
    , (
    SELECT COUNT(ExitDate) 
    FROM ExitTable 
    WHERE Clients.ClientNumber = ExitTable.ClientNumber 
    AND Len(ExitDate & '') > 0 
) AS ExitCount 
    FROM Clients 
) AS ActiveCustomers 
INNER JOIN tblClientAddress 
ON ActiveCustomers.ClientNumber = tblClientAddress.ClientNumber 
WHERE ActiveCustomers.IntakeCount > [ExitCount] 
AND tblClientAddress.CurrentResidence = True; 
+1

Помните, что когда мы обсуждали этот запрос ранее, я не советовал использовать дату входа и выхода _counts_, чтобы найти активных клиентов, и вместо этого рекомендовал использовать их _last incoming_ и _last exit_. См. Мой предыдущий ответ для рассуждений. – Yawar

ответ

2

Вы, кажется, не хватает запятой после Clients.LastName. Попробуйте:

SELECT ActiveCustomers.FirstName, ActiveCustomers.LastName, tblClientAddress.HomePhone, ActiveCustomers.ClientNumber 
FROM 
     (SELECT Clients.ClientNumber, 
       Clients.FirstName, 
       Clients.LastName, 
       (SELECT COUNT(ReferralDate) FROM IntakeTable WHERE Clients.ClientNumber = IntakeTable.ClientNumber AND Len(ReferralDate & '') > 0) AS IntakeCount, 
       (SELECT COUNT(ExitDate) FROM ExitTable WHERE Clients.ClientNumber = ExitTable.ClientNumber AND Len(ExitDate & '') > 0) AS ExitCount 
     FROM Clients) AS ActiveCustomers 
INNER JOIN tblClientAddress ON ActiveCustomers.ClientNumber = tblClientAddress.ClientNumber 
WHERE (((ActiveCustomers.IntakeCount)>[ExitCount]) AND 
     ((tblClientAddress.CurrentResidence)=True)); 

EDIT:

Вполне вероятно, что:

  • У вас есть много-к-одному (или один-ко-многим) отношений между Clients и tblClientAddress, и у вас есть две записи на «много» стороне. Если вы получаете повторяющиеся записи, вы можете добавить DISTINCT или GROUP BY,

И/Или:

  • То, что (SELECT COUNT( подзапросы каким-то образом портя их родительский запрос, и должны быть изменены так что они могут пойти в FROM пункта своего родительского запроса в с Inner Join, например:

    (SELECT ClientNumber, COUNT(ReferralDate) as IntakeCount FROM IntakeTable WHERE Len(ReferralDate & '') > 0 GROUP BY ClientNumber) AS qryIntakeCount

+0

Хорошая работа по переформатированию! – PowerUser

+0

@MontyWild Спасибо. +1 для быстрого и полезного ответа. Это запустило LastName, но запрос возвращает две строки для каждой записи, что неверно. Он должен возвращать только одну строку для каждой записи. Можете ли вы рассказать нам, как исправить эту проблему? – CodeMed

+0

Посмотрите мои изменения. –

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