SQL 跨表查询

SQL Query across tables

我正在尝试从一个由各种 table 组成的系统中提取数据,我在其中使用一个 table 作为主要列表,然后尝试 select 来自另一个的多个事件table 都与第一个 table.

中的单行相关

订单 table 和处理 table 已构建;

Orders
Ref         | Fruit     | Shapes        | Colours   | OrderDate
-----------------------------------------------------------------
22222       | Apple     | Round         | Red       | 2020/02/23
33333       | Pear      | Round         | Green     | 2020/02/23
44444       | Banana    | Long          | Yellow    | 2020/02/23

Processing
Fruit       | ProcessID     | ProcessDateTime
-----------------------------------------+----------------------------
Apple       | Receipt       | 2020/02/23 09:34:03
Apple       | Repack        | 2020/02/23 10:15:23
Apple       | Dispatch      | 2020/02/23 10:32:11
Pear        | Receipt       | 2020/03/23 08:34:55
Pear        | Repack        | 2020/02/23 09:08:43
Pear        | Dispatch      | 2020/02/23 10:43:21
Banana      | Receipt       | 2020/02/23 07:23:32
Banana      | Repack        | 2020/02/23 09:33:28
Banana      | Dispatch      | 2020/02/23 11:38:01

并且提取出来的数据应该是类似的格式;

Ref     | Fruit | DateOrdered   | DateReceipt           | DateRepack            | DateDispatch
-----------------------------------------------------------------------------------------------------
22222   | Apple | 2020/02/23    | 2020/02/23 09:34:03   | 2020/02/23 10:15:23   | 2020/02/23 10:32:11
33333   | Pear  | 2020/02/23    | 2020/02/23 08:34:55   | 2020/02/23 09:08:43   | 2020/02/23 10:43:21
44444   | Banana| 2020/02/23    | 2020/02/23 07:23:32   | 2020/02/23 09:33:28   | 2020/02/23 11:38:01

我创建的代码将开始类似于;

SELECT
Orders.Ref,
Orders.Fruit,
Orders.Shapes,
Orders.Colours,
.Now I want to select each ProcessID for each Ref and ProcessDateTime date for each of the processes in Processing. 
There are 3 processes in the example here, but it will not necesarily always
be 3, it will vary in number of processes.

FROM Orders
LEFT INNER JOIN Processing ON Processing.Fruit = Orders.Fruit

WHERE
Orders.OrderDate BETWEEN date1 AND date2;  -- These dates will be identified when running...

我在网上查看了有关条件连接的信息,但在这里遇到了一些困难,非常欢迎任何帮助,谢谢!

感谢 Gordon 对这个问题的回复,除了 table 处理中的每个条目都放在单独的行上,而不是组合在一起之外,它对我来说几乎可以正常工作正如我所希望的那样,在一条线上。 使用您的解决方案,我得到了;

Ref     | Fruit | DateOrdered   | DateReceipt           | DateRepack            | DateDispatch
-----------------------------------------------------------------------------------------------------
22222   | Apple | 2020/02/23    | 2020/02/23 09:34:03   |                       |                   
22222   | Apple | 2020/02/23    |                       | 2020/02/23 10:15:23   |                    
22222   | Apple | 2020/02/23    |                       |                       | 2020/02/23 10:32:11
33333   | Pear  | 2020/02/23    | 2020/02/23 08:34:55   |                       | 
33333   | Pear  | 2020/02/23    |                       | 2020/02/23 09:08:43   |
33333   | Pear  | 2020/02/23    |                       |                       | 2020/02/23 10:43:21
44444   | Banana| 2020/02/23    | 2020/02/23 07:23:32   |                       | 
44444   | Banana| 2020/02/23    |                       | 2020/02/23 09:33:28   | 
44444   | Banana| 2020/02/23    |                       |                       | 2020/02/23 11:38:01

而不是下面我想达到的结果;

Ref     | Fruit | DateOrdered   | DateReceipt           | DateRepack            | DateDispatch
-----------------------------------------------------------------------------------------------------
22222   | Apple | 2020/02/23    | 2020/02/23 09:34:03   | 2020/02/23 10:15:23   | 2020/02/23 10:32:11
33333   | Pear  | 2020/02/23    | 2020/02/23 08:34:55   | 2020/02/23 09:08:43   | 2020/02/23 10:43:21
44444   | Banana| 2020/02/23    | 2020/02/23 07:23:32   | 2020/02/23 09:33:28   | 2020/02/23 11:38:01

您可以使用条件聚合:

SELECT o.Ref, o.Fruit, 
       MAX(CASE WHEN p.ProcessID = 'RECEIPT' THEN ProcessDateTime END) as receipt,
       MAX(CASE WHEN p.ProcessID = 'REPACK' THEN ProcessDateTime END) as repack,
       MAX(CASE WHEN p.ProcessID = 'DISPATCH' THEN ProcessDateTime END) as dispatch
FROM Orders o LEFT JOIN
     Processing p
     ON p.Fruit = o.Fruit
WHERE o.OrderDate BETWEEN date1 AND date2
GROUP BY o.Ref, o.Fruit;