INNER JOIN для нескольких строк действует так, как будто строки не существуют - PullRequest
0 голосов
/ 27 сентября 2018

Мне нужно извлечь статистику студентов, зарегистрированных по провинции.У студента есть адрес с почтовым индексом;почтовый индекс связан с судейским округом;судебный округ связан с провинцией.Построить выборку с использованием внутренних объединений довольно просто.

Однако, от адреса учащегося до почтового индекса (код = 1911) у меня возникла проблема, поскольку существует несколько записей для почтового кода с разными названиями пригородов.;см. извлечение данных ниже.

1911    FLORA GARDENS,Vanderbijlpark    7702    VANDERBIJLPARK
1911    HENBYL                          7702    VANDERBIJLPARK
1911    LUMIER                          7702    VANDERBIJLPARK
1911    NORTHDENE,Vanderbijlpark        7702    VANDERBIJLPARK
1911    PARK SOUTH                      7702    VANDERBIJLPARK
1911    STAAL                           7702    VANDERBIJLPARK
1911    VANDERBIJLPARK                  7702    VANDERBIJLPARK
1911    ZUURFONTEIN                     7702    VANDERBIJLPARK

Когда я выполняю INNER JOIN, выбираю вот так,

FROM gen.getadr
INNER JOIN stud.iadbio ON getunum = iadstno
INNER JOIN stud.ibvpos ON getpcode = ibvcode
INNER JOIN stud.ibdmag ON ibvcode = ibdcode

строки не возвращаются.

Когда я изменяю это наЛЕВОЕ соединение

FROM gen.getadr
INNER JOIN stud.iadbio ON getunum = iadstno
LEFT JOIN stud.ibvpos ON getpcode = ibvcode
LEFT JOIN stud.ibdmag ON ibvcode = ibdcode

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

Можно ли указать, что соединение между getadr (адрес учащегося) и ibvpos (определение почтовых индексов - несколько строк)должно основываться на уникальном совпадении между getpcode и ibvcode?

Полный оператор выбора выглядит следующим образом:

SELECT getunum, getnumtype, getaddrtype, GETCSn, getsdate, getedate, gettac,    
getsyscrt 
, getadr1, getadr2, getadr3, getadr4, getpcode, ibvtown, ibdname
FROM gen.getadr
 INNER JOIN stud.iadbio ON getunum = iadstno
 LEFT JOIN stud.ibvpos ON getpcode = ibvcode
 LEFT JOIN stud.ibdmag ON ibvcode = ibdcode
where getnumtype = 'I' and getsyscrt = 'S' 
 AND iadstno = 217244521
 AND getaddrtype = 'PA'
 AND getedate IS NULL
 AND getprimary = 'Y'
ORDER BY getsyscrt, getnumtype, getcsn 

Любая помощь приветствуется.

С уважением,

Phlip

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018

Я просто создал суб-выбор, который однозначно выбирает почтовый индекс и район магистратуры, например:

FROM gen.getadr
  INNER JOIN stud.iadbio ON getunum = iadstno
  INNER JOIN 
    (SELECT DISTINCT ibvpcode, ibvcode 
     FROM stud.ibvpos
    ) ON getpcode = ibvpcode
  INNER JOIN stud.ibdmag ON ibvcode = ibdcode
  INNER JOIN stud.innprv ON ibdprovc = innprovc

Это дало мне ожидаемые результаты.

С уважением,

Phlip

0 голосов
/ 27 сентября 2018

Если нет результатов внутреннего объединения, это означает, что данные из таблицы getadr не совпадают с данными из других таблиц (например, нет данных или формат данных отличается в этих таблицах).У вас есть какие-либо результаты по этому запросу?Значение getpcode не равно нулю и присутствует в таблице stud.ibvpos?

  SELECT getunum, getpcode 
  FROM gen.getadr
  INNER JOIN stud.iadbio ON getunum = iadstno
  LEFT JOIN stud.ibvpos ON getpcode = ibvcode
  LEFT JOIN stud.ibdmag ON ibvcode = ibdcode
  WHERE ibvcode is not null
  AND getnumtype = 'I'
  AND getsyscrt = 'S'
  AND getaddrtype = 'PA'
  AND getedate IS NULL
  AND getprimary = 'Y'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...