SQL INNER JOIN 内部连接、整合多个资料表

在 SQL 语句中 INNER JOIN 内部连接主要是用于结合两个或多个资料表的方式,只返回两个资料表中共有的资料,通常是使用在两个 Data Sheet 资料表之间的 Column 栏位,通过 INNER JOIN 以便进行匹配。。

SQL JOIN 连接资料表或是 Access 将不同资料表之间栏位的「关连性」来结合多个资料表之检索。其中结合多个「资料表」而组成一个暂时性资料表以提供资料分析查询,而在原本各资料表中之记录不会因此连接查询而改变。当使用组合来自多个资料表的记录时,只要指出如何将一个资料表中的记录与另一个资料表中的记录进行匹配。

INNER JOIN 内部连接为匹配必需指定的等值的资料格式,例如文字或数值的判断,而查询结果只会返回符合连接条件的资料。仅当资料表都符合 ON 子句中指定的条件时,从指定资料表中选择所有符合资料出现在结果中。


产品资料 PRODUCT_DATA

描述产品的细节一般如产品编号,就是名称规格及价格、库存量、等相关记录。

P_IDP_NAMEP_PRICE
P001深沟滚珠轴承200
P002铸铁带座轴承350
P003滚珠花键2300
P004万向接头420
P005套筒华司100

业务员资料 PRODUCT_SALE

业务员编号,描述业务员的基本 Identity 业务员名称、以及其相关的身份详细记录。

S_IDS_NAME
S001王维奥
S002陈世昌
S003朱莉亚

订单资料 PRODECT_ORDER

订单资料由产生日期、订单编号、记录产品编号、销售业务员的编号、数量,多是由编号记载。
订单关连性以编号记录,编号对应可节省记录空间,亦可于维护基本资料时的方便性。

O_DATEO_PRODUCTO_QTYO_SALE
2018/3/2P00150S001
2018/3/6P00220S002
2018/3/18P00310S002
2018/4/10P00520S003
2018/4/15P00415S001


整合多个资料表

例如于 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_DATES_NAMEP_NAMEP_PRICEO_QTYP_PRICE * O_QTY
2018/3/2王维奥深沟滚珠轴承2005010000
2018/3/6陈世昌铸铁带座轴承350207000
2018/3/18陈世昌滚珠花键23001023000
2018/4/10朱莉亚套筒华司100202000
2018/4/15王维奥万向接头420156300


指定范围资料表检索 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_DATES_NAMEP_NAMEP_PRICEO_QTYP_PRICE * O_QTY
2018/4/10朱莉亚套筒华司100202000
2018/4/15王维奥万向接头420156300