如何交叉引用和组合来自许多表的值

时间:2016-10-05 09:28:10

标签: sql ms-access ms-access-2010

我有三个表,tblTemplates,tblBLNALM和tblPrefs。他们遵循这种结构:

tblPrefs:
--------------------------------------------
|  Pref  |  Derived-Template  |  Template  |
--------------------------------------------
|GA      |BLNALM_F03          |AIN_F03     |
--------------------------------------------
|HSSD    |BLNALM_F01          |AIN_F01     |
-------------------------------------------- etc...

tblBLNALM:
------------------------------------------------------------------
|  Controller  |  Compound  |  Tagname  | BaseTemplate  |  Name  |
------------------------------------------------------------------
|15CP42        |15F00       |HSSD30001C |BLNALM         |IN_7    |
------------------------------------------------------------------
|15CP12        |15F06       |GA123456   |BLNALM         |IN_3    |
------------------------------------------------------------------ etc...

tblTemplates:
---------------------------------------
|  Template  |  Maintenance Override  |
---------------------------------------
|AIN_F01     |IN_7                    |
---------------------------------------
|AIN_F02     |IN_5                    |
--------------------------------------- 
|AIN_F03     |IN_7                    |
---------------------------------------etc...

我需要做的是查看tblBLNALM.Tagname中数字前面的字符是否存在于tblPrefs中,如果是,则使用它来确定它是什么模板。然后使用此模板和tblTemplates计算出维护覆盖它的内容。

最终结果看起来应该是这样的:

-----------------------------------------------------------------------------
|  Controller  |  Compound  |  Tagname  | Template  | Maintenance Override  |
-----------------------------------------------------------------------------
|15CP12        |15F06       |GA123456   |AIN_F03    |IN_7                   |
----------------------------------------------------------------------------- etc...

我的直觉是使用一些EXISTS语句并且可以嵌套它们,但这没有帮助,所以我从哪里开始?

我正在使用msaccess 2010。

2 个答案:

答案 0 :(得分:1)

加入3个表:加入TemplatetblPrefs中的tblTemplates个字段,然后您应该加入TagnametblBLNALM的{​​{1}},但是在这里,您无法直接加入字段,因此请创建一个查询,其中选择Pref中的所有列,然后添加一个计算列,该列返回tblBLNALM字段中的起始字母,并将其用于与Tagname的联接而不是桌子。

答案 1 :(得分:1)

您可以在SQL连接中使用字符串操作。

如何比较标记名是否以 pref 开头?

SQL中的

将是:

SELECT tblBLNALM.Controller, 
    tblBLNALM.Compound, 
    tblBLNALM.Tagname, 
    tblTemplates.Template, 
    tblTemplates.[Maintenance Override]
FROM (tblTemplates 
    INNER JOIN tblPrefs ON tblTemplates.Template = tblPrefs.Template) 
    INNER JOIN tblBLNALM ON (tblPrefs.Pref = left(tblBLNALM.Tagname, len(tblPrefs.Pref)));

输出将如您所述:

+------------+----------+------------+----------+----------------------+
| Controller | Compound |  Tagname   | Template | Maintenance Override |
+------------+----------+------------+----------+----------------------+
| 15CP12     | 15F06    | GA123456   | AIN_F03  | IN_7                 |
| 15CP42     | 15F00    | HSSD30001C | AIN_F01  | IN_7                 |
+------------+----------+------------+----------+----------------------+