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;
我正在尝试从一个由各种 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;