如何购买客户的物品?

时间:2018-11-12 18:53:01

标签: sql database oracle

我有两个表:

  • 客户(客户ID(PK),名字,姓氏,电话)
  • 订单(订单编号(PK),物品名称,数量)

customer_id = order_id(每个客户一个order_id,用于标识客户)。

我的数据库中有:

INSERT INTO customer(first_name, last_name, phone) VALUES ('Colin', 'Farell', '123453');
INSERT INTO customer(first_name, last_name, phone) VALUES ('Aaron', 'Smith', '123451');
INSERT INTO customer(first_name, last_name, phone) VALUES ('Becky', 'Roberts', '123452');

INSERT INTO orders(item_name, quantity) VALUES ('Tissues', 2);
INSERT INTO orders(item_name, quantity) VALUES ('Lamp', 1);
INSERT INTO orders(item_name, quantity) VALUES ('Chocolate', 3);

如何获取特定客户购买的商品清单?例如,科林买了2张纸巾,一盏灯和3块巧克力。 正确的输出为(不重复first_name):

名字-项目名称-数量

Colin-组织-2

科林-灯-1

科林-巧克力-3

我尝试过:

SELECT customer.first_name, customer.last_name, orders.item_name, orders.quantity
FROM customer, orders
WHERE customer.customer_id = orders.order_id 
ORDER BY customer.first_name;

但是它显示了所有客户,而不是特定的客户... 问题是否还存在于WHERE customer.customer_id = orders.order_id中?因为如果一个客户可以有很多订单,如果我在订单表中插入更多东西,那么我的WHERE子句就没有意义了吗?

有什么想法可以消除我的困惑吗?谢谢

3 个答案:

答案 0 :(得分:2)

数据模型错误。应该是这样的:

SQL> create table customer
  2    (customer_id number primary key,
  3     first_name  varchar2(20),
  4     last_name   varchar2(20),
  5     phone       varchar2(20));

Table created.

SQL> create table items
  2    (item_id     number primary key,
  3     item_name   varchar2(20));

Table created.

SQL> create table orders
  2    (order_id    number primary key,
  3     customer_id number constraint fk_ord_cust references customer (customer_id)
  4    );

Table created.

SQL> create table order_details
  2    (order_det_id number primary key,
  3     order_id     number constraint fk_orddet_ord references orders (order_id),
  4     item_id      number constraint fk_orddet_itm references items (item_id),
  5     amount       number
  6    );

Table created.

一些快速而肮脏的样本数据:

SQL> insert all
  2    into customer values (100, 'Little', 'Foot', '00385xxxyyy')
  3    into items values (1, 'Apple')
  4    into items values (2, 'Milk')
  5    into orders values (55, 100)
  6    into order_details values (1000, 55, 1, 5)  -- I'm ordering 5 apples 
  7    into order_details values (1001, 55, 2, 2)  -- and 2 milks
  8  select * from dual;

6 rows created.

SQL> select c.first_name, sum(d.amount) count_of_items
  2  from customer c join orders o on o.customer_id = c.customer_id
  3  join order_details d on d.order_id = o.order_id
  4  group by c.first_name;

FIRST_NAME           COUNT_OF_ITEMS
-------------------- --------------
Little                            7

SQL>

或者,项目列表:

SQL> select c.first_name, i.item_name, d.amount
  2  from customer c join orders o on o.customer_id = c.customer_id
  3  join order_details d on d.order_id = o.order_id
  4  join items i on i.item_id = d.item_id;

FIRST_NAME           ITEM_NAME                AMOUNT
-------------------- -------------------- ----------
Little               Apple                         5
Little               Milk                          2

SQL>

答案 1 :(得分:1)

您要合并数据的两个表之间没有关系。请在两个表之间创建一个外键关系,这将帮助您获得一个可以提取数据的公共值。

例如-来自客户表的Customer_id列可以是表订单中的外键,用于指定每个客户下的订单。

以下查询应为您返回预期的结果:

选择customer.first_name,customer.last_name,orders.item_name,orders.quantity 来自客户,订单 WHERE customer.customer_id = orders.customer_id ORDER BY customer.first_name;

您指定的查询不会返回任何结果,因为两个表中的任何订单和客户ID都不匹配,因为它们都描述了两个不同的值。

希望有帮助。干杯!

答案 2 :(得分:0)

在上一个查询中,您已显示表已链接(customer.customer_id = orders.order_id),但是在已创建的表中,它们之间没有链接。我认为这应该可行:

第1步:创建如下客户表:

    Create table customer
   (customer_id id primary key,
   first_name  varchar(25),
   last_name   varchar(25),
   phone   int);

第2步:创建商品表,如下所示:

    Create  table Items  
    (item_id  primary key,
    item_name   varchar(25));

第3步:创建将上面的两个表关联起来的链接表,如下所示:

      Create table Orders 
      (Customer_Id int,
      Item_ID int,
      Quantity int);

第4步:使用此查询提取所需的信息:

 select c.first_name,i.item_name,o.Quantity from
 customer c inner join orders o on c.customer_id = o.customer_id
 inner join items i on i.item_id = o.Item_id;

请尝试一下,让我知道是否有问题。