Как правильно сформулировать внутреннее соединение - PullRequest
1 голос
/ 05 октября 2019

Я пытаюсь изучать объединения и много читал здесь (SOFlow) и в нескольких других местах, и, конечно, скопировал код и попробовал его.

Итак, я сделал этот код для своей таблицы:

SELECT
    a.FIRSTNAME, a.LASTNAME, 
    b.[LINE1], b.[LINE2], b.[LINE3], b.[SUBURB], 
    b.[STATE], b.[POSTCODE], 
    p.[PRIVATE], p.[BUSINESS], p.[MOBILE]
FROM
    (SELECT 
         a.UNIQID, a.FIRSTNAME, a.LASTNAME 
     FROM [PTPARTY]) a
INNER JOIN
    (SELECT 
         [LINE1], [LINE2], [LINE3], [SUBURB], [STATE], [POSTCODE], PARTYID 
     FROM 
         [PTAddresses]
     WHERE 
         ADDRESS_TYPE = 'Mailing') b ON a.Uniqid = b.Partyid
INNER JOIN
    (SELECT 
         [Uniqid], [PRIVATE], [BUSINESS], [MOBILE]
     FROM [PTPhone]) P ON a.Uniqid = P.Uniqid
WHERE
    a.UNIQID = 4

Но я получаю:

Сообщение 4104, Уровень 16, Состояние 1, Строка 3
Не удалось связать идентификатор из нескольких частей "a.UNIQID".

Сообщение 4104, уровень 16, состояние 1, строка 3
Не удалось связать многоэлементный идентификатор «a.FIRSTNAME».

Сообщение 4104, уровень 16, состояние 1, строка 3
Не удалось связать многокомпонентный идентификатор "a.LASTNAME".

Где, поскольку этот код работает отлично

SELECT
    a.FIRSTNAME, a.LASTNAME, 
    b.[LINE1], b.[LINE2], b.[LINE3], b.[SUBURB], b.[STATE], b.[POSTCODE],
    p.[PRIVATE], p.[BUSINESS], p.[MOBILE]
FROM
    (SELECT 
         PTPARTY.UNIQID, PTPARTY.FIRSTNAME, PTPARTY.LASTNAME 
     FROM [PTPARTY]) a
INNER JOIN
    (SELECT 
         [LINE1], [LINE2], [LINE3], [SUBURB], [STATE], [POSTCODE], PARTYID 
     FROM 
         [PTAddresses]
     WHERE
         ADDRESS_TYPE = 'Mailing') b ON a.Uniqid = b.Partyid
INNER JOIN
    (SELECT 
         [Uniqid], [PRIVATE], [BUSINESS], [MOBILE]
     FROM [PTPhone]) P ON a.Uniqid = P.Uniqid
WHERE
    a.UNIQID = 4

Я на 99% уверен, что не работаетотсюда был скопирован код с изменениями, чтобы соответствовать моим таблицам.

Просто интересно, что я делаю что-то не так.

Ну, я уверен, что я делаю что-то не так, но хотел бы знать,что.

С уважением и всем доброй работы

Ответы [ 3 ]

0 голосов
/ 05 октября 2019

Проверьте этот код. Это будет работатьОшибка связана с первым подзапросом, так как в первом подзапросе вы не указали псевдоним таблицы, а использовали имя alias.column. Поэтому измените его на следующее:

Select a.FIRSTNAME,a.LASTNAME, b.[LINE1],b.[LINE2],b.[LINE3],b.[SUBURB],b.[STATE],b.[POSTCODE],p.[PRIVATE],p.[BUSINESS],p.[MOBILE]
 from
(SELECT UNIQID,FIRSTNAME,LASTNAME FROM [PTPARTY]) a
inner join
(SELECT [LINE1],[LINE2],[LINE3],[SUBURB],[STATE],[POSTCODE],PARTYID FROM [PTAddresses]
  where ADDRESS_TYPE = 'Mailing') b on a.Uniqid = b.Partyid
inner join
(SELECT [Uniqid],[PRIVATE],[BUSINESS],[MOBILE]FROM [PTPhone]) P on a.Uniqid = P.Uniqid
where a.UNIQID = 4
0 голосов
/ 05 октября 2019

Чтобы помочь вам быть очень конкретным:

Рассмотрите эту часть вашего запроса:

FROM
    (SELECT 
         a.UNIQID, a.FIRSTNAME, a.LASTNAME 
     FROM [PTPARTY]) a

Когда вы удаляете скобки из подзапроса, у вас есть это:

 SELECT 
     a.UNIQID, a.FIRSTNAME, a.LASTNAME 
 FROM [PTPARTY]

Элемент a.UNIQUID имеет вид псевдоним таблицы . имя столбца . Однако в скобках вы не указываете псевдоним таблицы для [PTPARTY]. Таким образом, a.UNIQUID недопустимо.

Поскольку существует только 1 таблица, псевдоним или ссылка на таблицу не нужны. Для ясности я добавлю опционально"КАК" с этого момента. Имея только 1 таблицу, вы можете сделать это только с именами столбцов:

FROM
    (SELECT 
         UNIQID, FIRSTNAME, LASTNAME 
     FROM [PTPARTY]) AS a

Конечно, вы часто бы объединяли таблицы и хотели использовать псевдонимы, так что вы можете сделать это в скобках:

FROM
    (SELECT 
         z.UNIQID, z.FIRSTNAME, z.LASTNAME 
     FROM [PTPARTY] AS z) AS a

В этом сценарии псевдоним таблицы "z" недоступен / недопустим вне скобок. По этой причине, хотя это, вероятно, не лучшая практика, вы можете даже использовать тот же псевдоним. Опять же, это может сбить с толку .

FROM
    (SELECT 
         a.UNIQID, a.FIRSTNAME, a.LASTNAME 
     FROM [PTPARTY] AS a) AS a
0 голосов
/ 05 октября 2019

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

Select p.FIRSTNAME, p.LASTNAME, a.[LINE1],
       a.[LINE2], a.[LINE3], a.[SUBURB], a.[STATE], a.[POSTCODE],
       ph.[PRIVATE], ph.[BUSINESS], ph.[MOBILE]
 from PTPARTY p inner join
      PTAddresses a
      on p.Uniqid = a.Partyid inner join
      PTPhone ph
      on p.Uniqid = Ph.Uniqid
where a.ADDRESS_TYPE = 'Mailing' and p.UNIQID = 4;

Это действительно намного проще. Обратите внимание, что я заменил псевдоним таблицы на псевдонимы значения. Однако вам не нужны подзапросы:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...