JOIN多个表的语法和顺序

时间:2014-05-19 16:31:16

标签: sql join database-table

SQL Gurus,

我有一个使用" old"连接语法的样式如下,使用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语法的任何好例子?

提前致谢!

3 个答案:

答案 0 :(得分:0)

您没有在连接中命名表,因此它不知道哪个列来自哪个表。尝试类似:

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

答案 1 :(得分:0)

从上面的查询中,我假设p2_uid的命名约定来自p2_tbl。下面是我对WHERE加入使用INNER联接的最佳解释。

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,rahter使用 TableName.ID
  • 除非有意义,否则不要使用别名。 (即加入表格 需要别名的自我。)

答案 2 :(得分:0)

使用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