Full JOIN 的定义

来源:互联网 发布:openssl linux 编辑:程序博客网 时间:2024/06/02 21:17
Full JOIN 的定义:All records from both tables - identical to a union of left join and rigth join
  1. --tbl_A:
  2. --STCD  STNM
  3. --10001 站点A
  4. --10002 站点B
  5. --10003 站点C
  6. --10004 站点D
  7. --10005 站点E
  8. If object_id('tbl_A'is not NULL
  9.     drop table tbl_A
  10. Go
  11. Create table tbl_A (STCD int,STNM varchar(100))
  12. Go
  13. insert into tbl_A
  14. select 10001,'站点A' Union all
  15. select 10002,'站点B' Union all
  16. select 10003,'站点C' Union all
  17. select 10004,'站点D' Union all
  18. select 10005,'站点E'
  19. --tbl_B:
  20. --STCD      TM    VAL1    VAL2
  21. --...
  22. --10003 2008-12-01  1      1
  23. --10003 2008-12-03  3      3
  24. --10003 2008-12-07  7      7
  25. --...
  26. If object_id('tbl_B'is not NULL
  27.     drop table tbl_B
  28. Go
  29. Create table tbl_B (STCD int,TM datetime,VAL1 int,VAL2 int)
  30. Go
  31. insert into tbl_B
  32. select 10003,'2008-12-01',1,1 Union all
  33. select 10003,'2008-12-03',3,3 Union all
  34. select 10003,'2008-12-07',7,7
  35. --tbl_C:
  36. --STCD      TM    VAL3    VAL4
  37. --...
  38. --10003 2008-12-02  4      4
  39. --10003 2008-12-03  6      6
  40. --10003 2008-12-04  8      8
  41. --10003 2008-12-07  14      14
  42. --...
  43. If object_id('tbl_C'is not NULL
  44.     drop table tbl_C
  45. Go
  46. Create table tbl_C (STCD int,TM datetime,VAL3 int,VAL4 int)
  47. Go
  48. insert into tbl_C
  49. select 10003,'2008-12-02',4,4 Union all
  50. select 10003,'2008-12-03',6,6 Union all
  51. select 10003,'2008-12-04',8,8 Union all
  52. select 10003,'2008-12-07',14,14
  53. /*
  54. tbl_A:站点代码、站点名称的索引表
  55. tbl_B:存储所有站点的某一类监测数据(如:VAL1、VAL2)
  56. tbl_C:存储所有站点的另一类监测数据(如:VAL3、VAL4)
  57. tbl_B和tbl_C的TM(时间)字段数值不一定相同
  58. 要显示满足某站点的所有不同时间的VAL1、VAL2、VAL3、VAL4数据。
  59. */
  60. --全连接
  61. select ISNULL(b.STCD,c.STCD) STCD,
  62. ISNULL(convert(varchar(100),b.TM,23),convert(varchar(100),c.TM,23)) TM,
  63. ISNULL(cast(b.VAL1 as varchar),'-') VAL1,
  64. ISNULL(cast(b.VAL2 as varchar),'-') VAL2,
  65. ISNULL(cast(c.VAL3 as varchar),'-') VAL3,
  66. ISNULL(cast(c.VAL4 as varchar),'-') VAL4
  67. from tbl_B b
  68. FULL join tbl_C c on b.STCD=c.STCD  and b.TM=c.TM
  69. /*
  70. STCD    TM  VAL1    VAL2    VAL3    VAL4
  71. 10003   2008-12-01  1   1   -   -
  72. 10003   2008-12-03  3   3   6   6
  73. 10003   2008-12-07  7   7   14  14
  74. 10003   2008-12-02  -   -   4   4
  75. 10003   2008-12-04  -   -   8   8
  76. */
  77. --左外连接
  78. select ISNULL(b.STCD,c.STCD) STCD,ISNULL(convert(varchar(100),b.TM,23),convert(varchar(100),c.TM,23)) TM,
  79. ISNULL(cast(b.VAL1 as varchar),'-') VAL1,
  80. ISNULL(cast(b.VAL2 as varchar),'-') VAL2,
  81. ISNULL(cast(c.VAL3 as varchar),'-') VAL3,
  82. ISNULL(cast(c.VAL4 as varchar),'-') VAL4
  83. from tbl_B b
  84. Left join tbl_C c on b.STCD=c.STCD  and b.TM=c.TM
  85. /*
  86. STCD    TM  VAL1    VAL2    VAL3    VAL4
  87. 10003   2008-12-01  1   1   -   -
  88. 10003   2008-12-03  3   3   6   6
  89. 10003   2008-12-07  7   7   14  14
  90. */
  91. --右外连接
  92. select ISNULL(b.STCD,c.STCD) STCD,ISNULL(convert(varchar(100),b.TM,23),convert(varchar(100),c.TM,23)) TM,
  93. ISNULL(cast(b.VAL1 as varchar),'-') VAL1,
  94. ISNULL(cast(b.VAL2 as varchar),'-') VAL2,
  95. ISNULL(cast(c.VAL3 as varchar),'-') VAL3,
  96. ISNULL(cast(c.VAL4 as varchar),'-') VAL4
  97. from tbl_B b
  98. Right join tbl_C c on b.STCD=c.STCD  and b.TM=c.TM
  99. /*
  100. STCD    TM  VAL1    VAL2    VAL3    VAL4
  101. 10003   2008-12-02  -   -   4   4
  102. 10003   2008-12-03  3   3   6   6
  103. 10003   2008-12-04  -   -   8   8
  104. 10003   2008-12-07  7   7   14  14
  105. */