我有两个表:
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子句就没有意义了吗?
有什么想法可以消除我的困惑吗?谢谢
答案 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;
请尝试一下,让我知道是否有问题。