我有一个虚构公司的数据库。此数据库有三个表:customer
,product
和orders
。对于此查询,我只使用两个表:customer
和orders
。我试图列出过去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
有人请告诉我我错过了什么吗?
答案 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日午夜开始接受订单。
希望这有帮助。