为每个订单号显示多个客户

时间:2018-03-28 01:12:51

标签: sql oracle

我有一个虚构公司的数据库。此数据库有三个表:customerproductorders。对于此查询,我只使用两个表:customerorders。我试图列出过去10天内订购商品的所有客户,但是,每次运行此代码时都会:

select concat(concat(customer.first_name, ' '), customer.last_name) as customer, orders.orderid, orders.productid, orders.order_date
from customer, orders
where orders.order_date > sysdate-10
order by orders.order_date;

我得到一个结果,列出了具有相同ORDERID个数字的6个客户中的每一个:

CUSTOMER                                       ORDERID  PRODUCTID ORDER_DATE
-------------------------------------------- ---------- ---------- ----------
Forrest Gump                                       113      20011 18-MAR-18
Bob Smith                                          113      20011 18-MAR-18
Michael Jordan                                     113      20011 18-MAR-18 
Sara Hamms                                         113      20011 18-MAR-18 
Joe Socks                                          113      20011 18-MAR-18`
Emma Bobleton                                      113      20011 18-MAR-18
Sara Hamms                                         114      20011 18-MAR-18 
Joe Socks                                          114      20011 18-MAR-18 
Michael Jordan                                     114      20011 18-MAR-18
Emma Bobleton                                      114      20011 18-MAR-18
Bob Smith                                          114      20011 18-MAR-18
CUSTOMER                                       ORDERID  PRODUCTID ORDER_DATE
-----------------------------------------   ---------- ---------- ----------
Forrest Gump                                       114      20011 18-MAR-18
Joe Socks                                          115      20010 19-MAR-18 
Sara Hamms                                         115      20010 19-MAR-18
Bob Smith                                          115      20010 19-MAR-18
Forrest Gump                                       115      20010 19-MAR-18 
Michael Jordan                                     115      20010 19-MAR-18 
Emma Bobleton                                      115      20010 19-MAR-18
Bob Smith                                          116      30001 19-MAR-18
Forrest Gump                                       116      30001 19-MAR-18
Michael Jordan                                     116      30001 19-MAR-18 
Sara Hamms                                         116      30001 19-MAR-18
CUSTOMER                                       ORDERID  PRODUCTID ORDER_DATE
------------------------------------------- ---------- ---------- ----------
Joe Socks                                          116      30001 19-MAR-18
Emma Bobleton                                      116      30001 19-MAR-18 

etc...

我希望它显示与客户相关的订单,如下所示:

CUSTOMER                                       ORDERID  PRODUCTID ORDER_DATE
------------------------------------------- ---------- ---------- ----------
Forrest Gump                                      113      20011 19-MAR-18
Forrest Gump                                      114      20011 19-MAR-18
Sara Hamms                                        115      20010 19-MAR-18
Emma Bobleton                                     116      30001 19-MAR-18

有人请告诉我我错过了什么吗?

2 个答案:

答案 0 :(得分:0)

就像评论状态一样,您需要加入表格,如下所示

select concat(concat(customer.first_name, ' '), customer.last_name) as customer, orders.orderid, orders.productid, orders.order_date
from customer
JOIN orders ON orders.customerId = customer.id
where orders.order_date > sysdate-10
order by orders.order_date

答案 1 :(得分:0)

这种情况可能是那些讨厌旧语法并且只想查看ANSI连接语法的人可能会有一个观点。如果您一直在使用"较新的" ANSI连接语法可能不会发生这种情况。这是使用旧的连接语法查询的结果:

select concat(concat(customer.first_name, ' '), customer.last_name) as customer
     , orders.orderid, orders.productid, orders.order_date
  from customer, orders
 where customer.customer_id = orders.customer_id
   and orders.order_date > sysdate-10
 order by orders.order_date;

正如我在上面的评论中提到的,连接运算符||仅适用于这些情况。此外,使用表别名可以节省您的击键。最后,请了解更新的连接语法并使用它:

SELECT TRIM(c.first_name || ' ' || c.last_name) AS customer
     , o.orderid, o.productid, o.order_date
  FROM customer c INNER JOIN orders o
    ON c.customer_id = o.customer_id
 WHERE o.order_date >= TRUNC(SYSDATE-10)
 ORDER BY order_date;

您还会看到我已将TRUNC()应用于您的SYSDATE-10。为什么?因为SYSDATE返回具有时间部分的Oracle DATE值。因此,如果您在过去10天内查找订单并在3月27日晚上7点运行查询,那么您只能在3月17日之后获得之后 7的订单 7 :00 pm。 (但也许这就是你想要的!)通过申请TRUNC(),您将在3月17日午夜开始接受订单。

希望这有帮助。