2017-02-06 21 views
0

我已经开始学习SQL是能够收集在生产流程对我们目前的方法(Excel电子表格)的数据活得比它的用处。SQL连接列既没有列是唯一

我使用SQLITE3使数据库,但我运行到哪里我试图创建单独的表中的列之间的关系的问题,而是关系中的商店唯一值既不列。

例如:

CREATE TABLE process1 (
    Product1ID INTEGER PRIMARY KEY, 
    StartDate TEXT, 
    EndDate TEXT 
); 

CREATE TABLE process2 (
    Product2ID INTEGER PRIMARY KEY, 
    StartDate TEXT, 
    EndDate TEXT 
); 

一旦产品已完成过程1,进入过程2,所以我想限制在进程2(起始日期)的任何值是在过程1(结束日期)已经找到日期。

但是,多个产品可以在同一日期开始和结束process1(和process2),所以任一表中的Date列都不包含UNIQUE值,我知道这是对外键约束的父键需求。

有没有办法约束表中的一列,使所有的值必须在另一个表的列不列或者持有独特的价值观已经存在?

+0

所有process1表中的项目都将在process2表中结束? – happymacarts

+0

@happymacarts是的,他们是 – joeqesi

+0

如果你可以修改表结构我可能会这样做:产品Id,p1_start_date,p1_end_date,p2_start_date,p2_end_date,...所有在一个表中,除非不会工作 – happymacarts

回答

2
CREATE TABLE products(
    ProductID INTEGER PRIMARY KEY, 
    ProductName TEXT  
); 

CREATE TABLE process1 (
    process1ID INTEGER PRIMARY KEY, 
    ProductID integer, 
    StartDate TEXT, 
    EndDate TEXT, 
    CONSTRAINT process1_productid_fkey FOREIGN KEY (productid) 
     REFERENCES products (productid) MATCH SIMPLE 
     ON UPDATE NO ACTION ON DELETE NO ACTION 
); 

CREATE TABLE process2 (
    process2ID INTEGER PRIMARY KEY, 
    ProductID integer, 
    StartDate TEXT, 
    EndDate TEXT, 
    CONSTRAINT process1_productid_fkey FOREIGN KEY (productid) 
     REFERENCES products (productid) MATCH SIMPLE 
     ON UPDATE NO ACTION ON DELETE NO ACTION 
); 

然后你可以用这样的连接进行选择。

Select * from products p 
LEFT JOIN process1 p1 on p1.ProductID = p.ProductID 
LEFT JOIN process2 p2 on p2.ProductID = p.ProductID