Гуру SQL,

У меня есть запрос, который использует "старый" стиль синтаксиса соединения, как показано ниже, с использованием 7 таблиц (имена таблиц и столбцов изменены для защиты невиновных), как показано ниже:

SELECT v1_col, p1_col
  FROM p1_tbl, p_tbl, p2_tbl, p3_tbl, v1_tbl, v2_tbl, v3_tbl
  WHERE p1_code = 1
  AND v1_code = 1
  AND p1_date >= v1_date
  AND p_uid = p1_uid 
  AND p2_uid = p1_uid AND p2_id = v2_id
  AND p3_uid = p1_uid AND p3_id = v3_id
  AND v2_uid = v1_uid
  AND v3_uid = v1_uid

Запрос работает нормально и дает ожидаемые результаты, но в качестве академического упражнения я попытался переписать запрос с использованием более стандартного синтаксиса JOIN, например, ниже представлена ​​одна версия, которую я пробовал:

SELECT V1.v1_col, P1.p1_col
  FROM p1_tbl P1, v1_tbl V1
  JOIN p_tbl P ON ( P.p_uid = P1.p1_uid )
  JOIN p2_tbl P2 ON ( P2.p2_uid = P1.p1_uid AND P2.p2_id = V2.v2_id )
  JOIN p3_tbl P3 ON ( P3.p3_uid = P1.p1_uid AND P3.p3_id = V3.v3_id )
  JOIN v2_tbl V2 ON ( V2.v2_uid = V1.v1_uid )
  JOIN v3_tbl V3 ON ( V3.v3_uid = V1.v1_uid )
 WHERE P1.p1_code = 1
   AND V1.v1_code = 1
   AND P1.p1_date >= V1.v1_date

Но, как бы я ни организовывал JOIN (используя MS SQL 2008 R2), я все время сталкиваюсь с ошибкой:

Не удалось связать составной идентификатор "col-name",

Где "col-name" меняется в зависимости от порядка JOIN, который я пытаюсь выполнить ...

Есть ли у кого-нибудь хорошие примеры того, как использовать синтаксис JOIN с таким количеством таблиц?

Заранее спасибо!

-1
bdcoder 19 Май 2014 в 20:31

3 ответа

Лучший ответ

При использовании синтаксиса JOIN вы можете получить доступ только к столбцам из таблиц в вашем текущем объединении или предыдущем объединении. Фактически, проще написать старый синтаксис, но он более подвержен ошибкам, например. вы можете легко забыть об условии соединения.

Это должно быть то, что вы хотите.

SELECT v1_col, p1_col
FROM p1_tbl
JOIN v1_tbl ON p1_date >= v1_date
JOIN v2_tbl ON v2_uid = v1_uid
JOIN v3_tbl ON v3_uid = v1_uid
JOIN  p_tbl ON p_uid = p1_uid 
JOIN p2_tbl ON p2_uid = p1_uid AND p2_id = v2_id
JOIN p3_tbl ON p3_uid = p1_uid AND p3_id = v3_id
WHERE p1_code = 1
  AND v1_code = 1
0
dnoeth 19 Май 2014 в 17:27

Вы не называете таблицы в своем объединении таким образом, чтобы он не знал, какой столбец из какой таблицы. Попробуйте что-нибудь вроде:

SELECT a.v1_col, b.p1_col
FROM   p1_tbl  b
JOIN   p_tbl   a  ON  b.p_uid = a.p1_uid

WHERE  b.p1_code = 1
0
Brian Gunter 19 Май 2014 в 16:48

Из вашего запроса выше я предполагаю, что соглашение об именах p2_uid происходит от p2_tbl. Ниже id моя лучшая интерпретация WHERE joins с использованием INNER joins.

SELECT
    v1_col, p1_col
FROM
    p1_tbl

    INNER JOIN p1_tbl
    ON p1_tbl.p1_date   >= v1_tbl.v1_date

    INNER JOIN p_tbl
    ON p_tbl.p_uid      = p1_tbl.p1_uid

    INNER JOIN p2_tbl
    ON  p2_tbl.p2_uid   = p1_tbl.p1_uid 

    INNER JOIN v2_tbl
    ON p2_tbl.p2_id     = v2_tbl.v2_id

    INNER JOIN p3_tbl
    ON p3_tbl.p3_uid = p1_tbl.p1_uid

    INNER JOIN v3_tbl
    ON p3_tbl.p3_id = v3_tbl.v3_id

    INNER JOIN v1_tbl
    ON  v1_tbl.v1_uid = v2_tbl.v2_uid
    AND v1_tbl.v1_uid = v3_tbl.v2_uid

WHERE
    p1_code = 1
AND
    v1_code = 1

Некоторые общие моменты, которые я нашел полезными в операторах SQL с множеством объединений.

  • Всегда уточняйте имена полностью. То есть не используйте ID, вместо этого используйте TableName.ID
  • Не используйте псевдонимы, если в них нет смысла. (То есть присоединение таблицы к самой себе, где требуется псевдоним.)
0
Richard Vivian 19 Май 2014 в 16:58