SQL查询关联2个表

时间:2018-10-13 11:30:42

标签: sqlite

我想在sqlite3中关联以下2个表。我从其他示例中了解到,每个表之间都应该有一些公共字段,因此我添加了order_ID。

1)如何编写sqlite查询以创建这些表之间的关系?

2)如何管理表2,其中同一订单可以具有多个产品,因此重复订单ID。一个订单可以包含最少1个产品和最多10个产品。因此它的动态范围是1-10。

table 1:
order_ID  date   buyer  ship_chr  
001       01/01  abc    15        
002       05/01  xyz    10       

table 2:
order_ID  prod    quantity   rate
001       pen     50         2
001       paper   25         1
001       pin     50         2
002       paper   25         1
002       pen     100        2

1 个答案:

答案 0 :(得分:1)

您似乎想存储订单以及有关这些订单的信息。首先,制作一个订单表。

create table orders (
    id integer primary key autoincrement,
    created_at timestamp not null default current_timestamp,
    buyer text not null,
    ship_chr text not null
)

请注意,表的主键只是order_id,而不是id。 它不是必需的,但这是我喜欢的约定,因为它使主键和外键保持不同。

还请注意,我正在使用timestamp类型存储日期,这将使您更容易使用SQLite date functions来处理这些日期。

现在,我们需要一个表格,以获取有关每个顺序中的内容的信息。

create table order_products (
    id integer primary key autoincrement,
    order_id integer not null references orders(id),
    product text not null,
    quantity integer not null,
    rate integer not null
)

这将在ordersorder_products之间建立一对多的关系。 一个订单可以有多个products。您可以使用以下方式将这些表链接在一起 join。这就是你会得到的 每个产品的买方。

select o.buyer, op.product, op.quantity
from order_products op
join orders o on o.id = op.order_id

abc|pen|50
abc|paper|25
abc|pin|50
xyz|paper|25
xyz|pen|100

join orders o on o.id = op.order_id说,对于order_products中的每一行,在orders中找到一个,其中order.id与该行的order_id相匹配,并将它们都视为一个单独的行。 / p>


在这里,您可能需要将productsbuyer做成自己的表 以及存储有关购买者和产​​品的任何信息。它还可以确保 产品和购买者的存在避免了错别字。

create table buyers (
    id integer primary key autoincrement,
    name text not null,
    address text not null,
    phone text not null
);

create table products (
    id integer primary key autoincrement,
    name text not null,
    stock integer not null default 0
);    

create table orders (
    id integer primary key autoincrement,
    created_at timestamp not null default current_timestamp,
    buyer_id integer references buyers(id) not null,
    ship_chr text not null
);

create table order_products (
    id integer primary key autoincrement,
    order_id integer not null references orders(id),
    product_id integer not null references products(id),
    quantity integer not null,
    rate integer not null
);

然后,您可以将所有内容组合在一起以获取有关产品和购买者的信息。

select b.name, p.name, op.quantity
from order_products op
join orders o on o.id = op.order_id
join buyers b on b.id = o.buyer_id
join products p on p.id = op.product_id

name|name|quantity
abc|pen|50
abc|paper|25
abc|pin|50
xyz|paper|25
xyz|pen|100

SQL Fiddle

如果您现在不这样做,以后将很难执行。