使用交叉联接
没有 WHERE 子句的交叉联接将产生联接所涉及的表的笛卡尔积。第一个表的行数乘以第二个表的行数等于笛卡尔积结果集的大小。下面是 Transact-SQL 交叉联接示例:USE pubs
SELECT au_fname, au_lname, pub_name
FROM authors CROSS JOIN publishers 
ORDER BY au_lname DESC结果集包含 184 行(authors 有 23 行,publishers 有 8 行;23 乘以 8 等于 184)。不过,如果添加一个 WHERE 子句,则交叉联接的作用将同内联接一样。例如,下面的 Transact-SQL 查询得到相同的结果集:USE pubs
SELECT au_fname, au_lname, pub_name
FROM authors CROSS JOIN publishers 
WHERE authors.city = publishers.city
ORDER BY au_lname DESC— 或
USE pubs
SELECT au_fname, au_lname, pub_name
FROM authors INNER JOIN publishers 
ON authors.city = publishers.city
ORDER BY au_lname DESC

解决方案 »

  1.   

    Cross Join
    Cross Join 逻辑运算符将第一个(顶端)输入中的每行与第二个(底端)输入中的每行联接在一起。使用交叉联接
    没有 WHERE 子句的交叉联接将产生联接所涉及的表的笛卡尔积。第一个表的行数乘以第二个表的行数等于笛卡尔积结果集的大小。下面是 Transact-SQL 交叉联接示例:USE pubs
    SELECT au_fname, au_lname, pub_name
    FROM authors CROSS JOIN publishers 
    ORDER BY au_lname DESC结果集包含 184 行(authors 有 23 行,publishers 有 8 行;23 乘以 8 等于 184)。不过,如果添加一个 WHERE 子句,则交叉联接的作用将同内联接一样。例如,下面的 Transact-SQL 查询得到相同的结果集:USE pubs
    SELECT au_fname, au_lname, pub_name
    FROM authors CROSS JOIN publishers 
    WHERE authors.city = publishers.city
    ORDER BY au_lname DESC— 或
    USE pubs
    SELECT au_fname, au_lname, pub_name
    FROM authors INNER JOIN publishers 
    ON authors.city = publishers.city
    ORDER BY au_lname DESC
      

  2.   

    你到查询分析器里执行一下:declare @a table(a int,b int)
    declare @b table(a int,b int)
    insert @a values(1,1)
    insert @a values(2,2)
    insert @b values(1,1)
    insert @b values(3,3)--左:
    select * from @a Aa left join @b Bb on Aa.a=Bb.a
    --右:
    select * from @a Aa right join @b Bb on Aa.a=Bb.a
    --内
    select * from @a Aa join @b Bb on Aa.a=Bb.a
    --外
    select * from @a Aa full join @b Bb on Aa.a=Bb.a
    --完全
    select * from @a,@b就可以看出异同了。
      

  3.   

    Cross Join
    Cross Join 逻辑运算符将第一个(顶端)输入中的每行与第二个(底端)输入中的每行联接在一起。