SQL INNER JOIN 内部连接、整合多个资料表
在 SQL 语句中 INNER JOIN 内部连接主要是用于结合两个或多个资料表的方式,只返回两个资料表中共有的资料,通常是使用在两个 Data Sheet 资料表之间的 Column 栏位,通过 INNER JOIN 以便进行匹配。。
SQL JOIN 连接资料表或是 Access 将不同资料表之间栏位的「关连性」来结合多个资料表之检索。其中结合多个「资料表」而组成一个暂时性资料表以提供资料分析查询,而在原本各资料表中之记录不会因此连接查询而改变。当使用组合来自多个资料表的记录时,只要指出如何将一个资料表中的记录与另一个资料表中的记录进行匹配。
INNER JOIN 内部连接为匹配必需指定的等值的资料格式,例如文字或数值的判断,而查询结果只会返回符合连接条件的资料。仅当资料表都符合 ON 子句中指定的条件时,从指定资料表中选择所有符合资料出现在结果中。
产品资料 PRODUCT_DATA
描述产品的细节一般如产品编号,就是名称规格及价格、库存量、等相关记录。
P_ID | P_NAME | P_PRICE |
---|---|---|
P001 | 深沟滚珠轴承 | 200 |
P002 | 铸铁带座轴承 | 350 |
P003 | 滚珠花键 | 2300 |
P004 | 万向接头 | 420 |
P005 | 套筒华司 | 100 |
业务员资料 PRODUCT_SALE
业务员编号,描述业务员的基本 Identity 业务员名称、以及其相关的身份详细记录。
S_ID | S_NAME |
---|---|
S001 | 王维奥 |
S002 | 陈世昌 |
S003 | 朱莉亚 |
订单资料 PRODECT_ORDER
订单资料由产生日期、订单编号、记录产品编号、销售业务员的编号、数量,多是由编号记载。
订单关连性以编号记录,编号对应可节省记录空间,亦可于维护基本资料时的方便性。
O_DATE | O_PRODUCT | O_QTY | O_SALE |
---|---|---|---|
2018/3/2 | P001 | 50 | S001 |
2018/3/6 | P002 | 20 | S002 |
2018/3/18 | P003 | 10 | S002 |
2018/4/10 | P005 | 20 | S003 |
2018/4/15 | P004 | 15 | S001 |
整合多个资料表
例如于 Microsoft Access 基本资料表建立,产品资料、业务员资料、订单资料。由于三个资料表组成,分别储存基本资料及累积的订单资料是以代号记录。然后可以使用 INNER JOIN 进行匹配出「产品名称」及「业务员名称」。
ON 子句用于根据 O_PRODUCT 的值匹配产品名称中的记录 O_SALE 匹配业务员名称。INNER JOIN 结合订单资料表 PRODECT_ORDER 中完整的描述。
strSql = "SELECT a.O_DATE, a.O_QTY, a.O_PRODUCT, b.P_NAME, b.P_PRICE, c.S_NAME "
strSql = strSql & "FROM ((PRODECT_ORDER a "
strSql = strSql & "INNER JOIN PRODUCT_DATA b ON a.O_PRODUCT = b.P_ID) "
strSql = strSql & "INNER JOIN PRODUCT_SALE c ON a.O_SALE = c.S_ID) "
strSql = strSql & "ORDER BY O_DATE"
SQL Alias 栏位别名、用于给表格指定一个临时简易名称,栏位别名目的是为了让 SQL 语句更易读。
例如三个表格使用 a, b, c 来简化。
INNER JOIN 组成提供资料分析查询
Access 资料库物件的关系、建立资料表的关联 Access 资料库、INNER JOIN 资料表共通的栏位及整合查询。
O_DATE | S_NAME | P_NAME | P_PRICE | O_QTY | P_PRICE * O_QTY |
---|---|---|---|---|---|
2018/3/2 | 王维奥 | 深沟滚珠轴承 | 200 | 50 | 10000 |
2018/3/6 | 陈世昌 | 铸铁带座轴承 | 350 | 20 | 7000 |
2018/3/18 | 陈世昌 | 滚珠花键 | 2300 | 10 | 23000 |
2018/4/10 | 朱莉亚 | 套筒华司 | 100 | 20 | 2000 |
2018/4/15 | 王维奥 | 万向接头 | 420 | 15 | 6300 |
指定范围资料表检索 Specified Range
从资料表中检索指定范围的资料,可以通过 WHERE 子句来指定搜寻条件,以过滤出符合条件的资料记录之间的所有资料列。
strSql = "SELECT a.O_DATE, a.O_QTY, a.O_PRODUCT, b.P_NAME, b.P_PRICE, c.S_NAME "
strSql = strSql & "FROM ((PRODECT_ORDER a "
strSql = strSql & "INNER JOIN PRODUCT_DATA b ON a.O_PRODUCT = b.P_ID) "
strSql = strSql & "INNER JOIN PRODUCT_SALE c ON a.O_SALE = c.S_ID) "
strSql = strSql & "WHERE O_DATE > #2018/04/01# ORDER BY O_DATE"
Access 日期查询条件使用 # 否则出现资料类型不符合其他资料库依据各别的规范。
O_DATE | S_NAME | P_NAME | P_PRICE | O_QTY | P_PRICE * O_QTY |
---|---|---|---|---|---|
2018/4/10 | 朱莉亚 | 套筒华司 | 100 | 20 | 2000 |
2018/4/15 | 王维奥 | 万向接头 | 420 | 15 | 6300 |