Sql 如何购买客户的物品?

Sql 如何购买客户的物品?,sql,database,oracle,Sql,Database,Oracle,我有两张桌子: 客户客户id主键、姓名、姓氏、电话 订单编号主键、项目名称、数量 如果customer\u id=order\u id,则每个客户有一个订单id,用于标识客户 在我的数据库中,我有: INSERT INTO customer(first_name, last_name, phone) VALUES ('Colin', 'Farell', '123453'); INSERT INTO customer(first_name, last_name, phone) VALUES ('A

我有两张桌子:

客户客户id主键、姓名、姓氏、电话 订单编号主键、项目名称、数量 如果customer\u id=order\u id,则每个客户有一个订单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);
如何获取特定客户购买的物品列表?例如,科林买了两张纸巾、一盏灯和三块巧克力。 正确的输出不会重复第一个\u名称:

第一个名称-项目名称-数量

科林-组织-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;
但它显示了所有的客户,而不是一个特定的客户。。。 问题是否也存在于:customer.customer\u id=orders.order\u id?因为如果一个客户可以有很多订单,如果我在orders表中插入更多的内容,那么我的WHERE子句就没有意义了


有什么办法来消除我的困惑吗?谢谢,数据模型是错误的。应该是这样的:

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>

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

例如,customers表中的Customer_id列可以是orders表中的外键,该外键将指定每个客户下的订单

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

选择customer.first\u name、customer.last\u name、orders.item\u name、orders.quantity 来自客户、订单 其中customer.customer\u id=orders.customer\u id 按客户订购。第一名

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


希望能有帮助。干杯

在上一次查询中,您已显示表是链接的customer.customer\u id=orders.order\u id,但在您创建的表中,它们之间没有链接。我认为这应该奏效:

步骤1:创建客户表,如下所示:

    Create table customer
   (customer_id id primary key,
   first_name  varchar(25),
   last_name   varchar(25),
   phone   int);
    Create  table Items  
    (item_id  primary key,
    item_name   varchar(25));
      Create table Orders 
      (Customer_Id int,
      Item_ID int,
      Quantity int);
步骤2:创建项目表,如下所示:

    Create table customer
   (customer_id id primary key,
   first_name  varchar(25),
   last_name   varchar(25),
   phone   int);
    Create  table Items  
    (item_id  primary key,
    item_name   varchar(25));
      Create table Orders 
      (Customer_Id int,
      Item_ID int,
      Quantity int);
步骤3:创建与上面两个表相关的链接表,如下所示:

    Create table customer
   (customer_id id primary key,
   first_name  varchar(25),
   last_name   varchar(25),
   phone   int);
    Create  table Items  
    (item_id  primary key,
    item_name   varchar(25));
      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;

请尝试一下,如果有问题请告诉我。

这是您自己创建的表吗?我看不出这两个表之间有任何关系,因此无法编写正确的查询。要将订单连接到客户,您需要对订单表中的customer表(customer_id列)进行引用。请注意,订单id是订单的唯一标识符,与客户id无关。将所有内容插入客户值100、‘Little’、‘Foot’、‘00385xxxyy’插入项目值1、‘Apple’插入项目值2、‘Milk’插入订单值55100插入订单详细信息值1000、55、1、,5-我订购了5个苹果,订单详细信息值为1001、55、2、2-和2-牛奶选择*从dual;你知道我为什么会因为一个错误而被违反唯一性约束吗?谢谢,我不知道;如你所见,在我的情况下,一切正常。如果你以我为例,你就不会犯那个错误。可能您创建了不同的主键约束,尝试插入与我不同的值。。。不知道你到底做了什么。请编辑您的初始消息问题,并复制/粘贴您自己的SQL*Plus会话,以便我了解您如何创建表、插入数据以及Oracle如何响应。