SQL / Access - вопрос о левом соединении, откуда берутся значения? - PullRequest
0 голосов
/ 29 июня 2011

У меня есть перекрестный запрос, который выглядит так:

State           Building        1          2          3          4           5

NY

SC

FL

Проблема, с которой я столкнулся, заключается в том, что я хочу, чтобы все состояния отображались независимо от того, есть ли данные. Итак, мне нужно левое соединение. К сожалению, когда я заменяю Inner Join на Left Join в коде, ничего не меняется. Я просто пытаюсь выяснить, откуда возникла проблема, и я думаю, что это может быть одной из следующих причин:

  1. Запрос не знает, куда тянуть значения из (Состояния все перечислены в поиске, но это может не быть там, где он смотрит)

  2. Левые соединения не работают на кросс-таблице запросов.

Может кто-нибудь сказать мне, что я делаю не так?

Вот SQL:

TRANSFORM Nz(Count(Demographics.ID))+0 AS CountOfID 
SELECT Demographics.State
FROM Research 
    INNER JOIN ( Demographics
        INNER JOIN [Status] 
            ON Demographics.ID=[Status].ID
            ) 
        ON (Research.ID=Demographics.ID) 
        AND (Research.ID=[Status].ID) 
WHERE ((([Status].Building_Status)='Complete'))
GROUP BY    Demographics.State,
            [Status].Building_Status 
PIVOT Research.Site In (1,2,3,4,5,6,7,8,9,10,11)

В идеале я мог бы указать значения строк в приведенном выше операторе In (который в настоящее время указывает значения столбцов 1-10), но я не думаю, что это можно сделать.

Ответы [ 4 ]

1 голос
/ 29 июня 2011

Я не совсем понял ваш пример, но из вашего комментария «Я хочу, чтобы все состояния отображались, независимо от того, есть ли данные», я думаю, что вы хотите «ВНЕШНЕЕ» соединение. Внешние объединения делают именно это - они включают данные независимо от того, есть ли совпадение. Внутренние объединения (по умолчанию) включают данные только в случае совпадения.

Надеюсь, это поможет, John

0 голосов
/ 30 июня 2011

вы можете использовать двухэтапное решение (оно более читабельно).
сначала приложите вашу фактическую (и рабочую) SQL-статистику в качестве представления

create view step1 as 
TRANSFORM ....
SELECT ...
FROM ...
PIVOT ...

, а затем создайте подобие:понадобится таблица состояний, как говорит @ Тони Эндрюс)

select * -- or whatever
from state 
left join step1 on state.id = step1.state

и это все

0 голосов
/ 29 июня 2011

Если ваша проблема в том, что в таблице Demographics может быть 0 строк с State = 'NY' (например), но вы все равно хотите видеть штат 'NY' в результатах, тогда вам нужна другая таблица, например States, которая имеет всесостояния в нем, и сделайте это вашим столом управления:

SELECT States.State
FROM States
    LEFT OUTER JOIN Demographics ON Demographics.state = States.state
...
0 голосов
/ 29 июня 2011

Вы должны изменить это так:

  TRANSFORM Nz(Count(Demographics.ID))+0 AS CountOfID
  SELECT Demographics.State
  FROM Demographics
      LEFT JOIN ( Research
         LEFT JOIN [Status]
              ON Demographics.ID=[Status].ID
             )
          ON (Research.ID=Demographics.ID)
          AND (Research.ID=[Status].ID)
  WHERE ((([Status].Building_Status)='Complete'))
 GROUP BY    Demographics.State,
             [Status].Building_Status
 PIVOT Research.Site In (1,2,3,4,5,6,7,8,9,10,11) 
...