夏目唯夏吧 关注:37贴子:4,052
  • 1回复贴,共1
SQL FULL JOIN 关键字
只要其中某个表存在匹配,FULL JOIN 关键字就会返回行。
FULL JOIN 关键字语法
SELECT column_name(s)
FROM table_name1
FULL JOIN table_name2
ON table_name1.column_name=table_name2.column_name
注释:在某些数据库中, FULL JOIN 称为 FULL OUTER JOIN。
原始的表 (用在例子中的):
"Persons" 表:
Id_PLastNameFirstNameAddressCity
1AdamsJohnOxford StreetLondon
2BushGeorgeFifth AvenueNew York
3CarterThomasChangan StreetBeijing
"Orders" 表:
Id_OOrderNoId_P
1778953
2446783
3224561
4245621
53476465
全连接(FULL JOIN)实例
现在,我们希望列出所有的人,以及他们的定单,以及所有的定单,以及定购它们的人。
您可以使用下面的 SELECT 语句:
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
FULL JOIN Orders
ON Persons.Id_P=Orders.Id_P
ORDER BY Persons.LastName
结果集:
LastNameFirstNameOrderNo
AdamsJohn22456
AdamsJohn24562
CarterThomas77895
CarterThomas44678
BushGeorge
34764
FULL JOIN 关键字会从左表 (Persons) 和右表 (Orders) 那里返回所有的行。如果 "Persons" 中的行在表 "Orders" 中没有匹配,或者如果 "Orders" 中的行在表 "Persons" 中没有匹配,这些行同样会列出。


1楼2014-03-25 21:36回复
    A left join B 的连接的记录数与A表的记录数同
    A right join B 的连接的记录数与B表的记录数同
    A left join B 等价B right join A
    table A:
    Field_K, Field_A
    1 a
    3 b
    4 c
    table B:
    Field_K, Field_B
    1 x
    2 y
    4 z
    select a.Field_K, a.Field_A, b.Field_K, b.Field_B from a left join b on a.Field_K=b.Field_K
    Field_K Field_A Field_K Field_B
    ---------- ---------- ---------- ----------
    1 a 1 x
    3 b NULL NULL
    4 c 4 z
    也就是说left join 则连接左边表中所有记录都会出现,如果根据连接条件在table2中找不到相关记录,则显示为null。
    right join 则显示右边表中的全部记录。inner join 则只有符合条件的记录才会出现在结果集中。
    1) in
    select * from tab where field in ('A', 'B', 'C')
    等价于select * from tab where field = 'A' or field = 'B' or field = 'C'
    2) on永在表连接的时候
    select * from a inner/left/right join b on a.xx = b.xx
    3)with
    作为递归的时候用,不是sql通用关键字
    DB2 with用法
    1,创建一个表
    create table regr (pid integer,id integer, name char(20))
    alter table regr alter id set not null add primary key(id)
    insert into regr values(-1,1,'library'),(1,2,'news'),(2,3,'world news'),(2,4,'politics'),(2,5,'bussiness'),(2,6,'science'),(2,7,'technology'),(1,8,'sports'),(8,9,'local'),(8,10,'collegiate'),(8,11,'professional'),(9,12,'soccer'),(10,13,'soccer'),(11,14,'soccer'),(9,15,'football'),(10,16,'football'),(11,17,'football')
    2,使用with得到数据树
    WITH RPL (PID, ID, name) AS
    (
    SELECT ROOT.PID, ROOT.ID, ROOT.Name
    FROM regr ROOT
    WHERE ROOT.PID = 8
    UNION ALL
    SELECT CHILD.PID, CHILD.ID, CHILD.Name
    FROM RPL PARENT, regr CHILD
    WHERE PARENT.ID = CHILD.PID
    )
    SELECT DISTINCT PID, ID, Name
    FROM RPL
    ORDER BY PID, ID, Name
    让我们研究这个查询的组件:
    RPL 作为一个具有以下三列的虚拟表:PID、ID 和 name。
    WITH 子句内的第一个 SELECT 语句是初始化表。它只执行一次。它的结果形成虚拟表的初始内容以作为递归的种子。在上面的示例中,种子是 PID 为 8 的一行或多行。
    第二个 SELECT 语句执行多次。将种子作为输入(JOIN 中的辅助表)传递给第二个 SELECT 语句以产生下一个行集合。将 JOIN 的结果添加(UNION ALL)到虚拟表的当前内容中,并放回到其中以形成用于下一次传递的输入。只要有行产生,这个过程就会继续。


    3楼2014-03-25 21:39
    回复