如果表值等于另一个值,则在SQL中联接表

如果表值等于另一个值,则在SQL中联接表,sql,ms-access,Sql,Ms Access,我有三张桌子。它们都代表了一个过程的不同阶段 表1: ID Process1 1 a 2 b 3 c 4 d 表2: ID ID2 Process2 1 50 e 2 51 f 4 52 g 表3: IDfromPrevious ID3 Process3 50 500 h 51 501 i 52

我有三张桌子。它们都代表了一个过程的不同阶段

表1:

ID   Process1

1    a       
2    b
3    c
4    d
表2:

ID   ID2     Process2
1    50        e
2    51        f
4    52        g 
表3:

IDfromPrevious   ID3   Process3
50               500   h
51               501   i
52               502   j
3                503   k
我想创建表4:

ID3  Process1  Process2  Process3
500   a          e           h
501   b          f           i
502   d          g           j
503   c                      k
问题是某些项目从流程1移动到流程3。其他项目从流程1移动到流程2到流程3。然而,所有的事情都在过程3结束。该项还通过每个进程被分配一个新ID。我在ms access 2016工作

我不知道从哪里开始使用SQL语句。我从未在SQL中编写过if语句,但我希望逻辑能像这样工作:

SELECT Table3.ID3, Table1.Process1, Table2.Process2, Table3.Process3
FROM (IF Table1.ID = Table3.IDfromPrevious Then Table1 INNER JOIN Table3 ON Table1.ID = Table3.IDfromPervious ELSE Table2.ID2 = Table3.IDfromPrevious Then Table2 INNER JOIN Table3 ON Table2.ID2 = Table3.IDfromPervious)

MS Access仅支持标准ISO SQL的一个子集。经过几次尝试后,这似乎只能通过子查询实现。然后,该子查询可以使用
Nz
条件进行外部联接,如下所示:

SELECT    Table3.ID3, Table12.Process1, Table12.Process2, Table3.Process3
FROM       (SELECT    Table2.ID2, Table1.ID, Table1.Process1, Table2.Process2
            FROM      Table1
            LEFT JOIN Table2 ON Table2.ID = Table1.ID) AS Table12
LEFT JOIN Table3 ON Table3.IDfromPrevious =  Nz(Table12.ID2, Table12.ID)

MS Access仅支持标准ISO SQL的一个子集。经过几次尝试后,这似乎只能通过子查询实现。然后,该子查询可以使用
Nz
条件进行外部联接,如下所示:

SELECT    Table3.ID3, Table12.Process1, Table12.Process2, Table3.Process3
FROM       (SELECT    Table2.ID2, Table1.ID, Table1.Process1, Table2.Process2
            FROM      Table1
            LEFT JOIN Table2 ON Table2.ID = Table1.ID) AS Table12
LEFT JOIN Table3 ON Table3.IDfromPrevious =  Nz(Table12.ID2, Table12.ID)


以简单的方式执行,将两个条件合并,然后保持NOTNULL

select t3.ID3, isnull(t1.process1, tx.Process1) Process1, t2.Process2, t3.Process3
from t3
left join t2 on t3.IDfromPrevious = t2.ID2
left join t1 on t2.ID = t1.ID
left join t1 tx on t3.IDfromPrevious = tx.ID

用一种简单的方法,连接两个条件,然后保持NOTNULL

select t3.ID3, isnull(t1.process1, tx.Process1) Process1, t2.Process2, t3.Process3
from t3
left join t2 on t3.IDfromPrevious = t2.ID2
left join t1 on t2.ID = t1.ID
left join t1 tx on t3.IDfromPrevious = tx.ID


SQL查询中没有可用的条件执行。表1和表2中是否都存在表3中的IDfromPrevious?您如何知道表1中的IDfromPrevious而不是表2中的IDfromPrevious?我还建议您用谷歌搜索“sql树和层次结构joe celko”。他写了一整本关于这个主题的书,尽管你可以从他的一些新闻组和论坛帖子中获得足够的信息来正确地建模这些数据。因为这个项目的处理方式,表1和表2永远不会有相同的ID和ID2。ID与IDfromPrevious有关系,ID2与IDfromPrevious也有关系。SQL查询中没有可用的条件执行。是否有可能在表1和表2中都有IDfromPrevious?您如何知道3的
IDfromPrevious
来自表1而不是表2?我还建议您用谷歌搜索“sql树和层次结构joe celko”。他写了一整本关于这个主题的书,尽管你可以从他的一些新闻组和论坛帖子中获得足够的信息来正确地建模这些数据。因为这个项目的处理方式,表1和表2永远不会有相同的ID和ID2。ID与IDfromPrevious有关系,ID2与IDfromPrevious也有关系。我收到一个语法错误。它说:“查询表达式‘Table3 ON Table3.IDFromPrevious in(Table1.ID,Table2.ID2)’中的语法错误。”您可能需要执行
左联接Table3.IDFromPrevious=Table1.ID或Table3.IDFromPrevious=Table2.ID2,我将其作为替代添加。与标准SQL相比,MS Access有许多限制。可能
Nz
会起作用。作为另一种选择,我已经尝试了所有这些。我仍然收到“此加入不受支持”的错误。很抱歉,延迟太久。我终于用你的数据设置了MS Access。我的最新答案应该有效。你能告诉我吗?我有个语法错误。它说:“查询表达式‘Table3 ON Table3.IDFromPrevious in(Table1.ID,Table2.ID2)’中的语法错误。”您可能需要执行
左联接Table3.IDFromPrevious=Table1.ID或Table3.IDFromPrevious=Table2.ID2,我将其作为替代添加。与标准SQL相比,MS Access有许多限制。可能
Nz
会起作用。作为另一种选择,我已经尝试了所有这些。我仍然收到“此加入不受支持”的错误。很抱歉,延迟太久。我终于用你的数据设置了MS Access。我的最新答案应该有效。你能告诉我吗?