2017-02-06 3 views
0

現在の方法(Excelスプレッドシート)が有効であるため、プロダクションフローでデータを収集できるようにSQLを学習し始めました。いずれの列もUNIQUEでないテーブル間の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に入ったので、私はすでにプロセス1(終了日)で見つかった日付であることをプロセス2(開始日)のいずれかの値を制約したかったです。

複数の製品で同じ日付にprocess1(およびprocess2)を開始して終了することができるため、両方の表のDate列にUNIQUE値が含まれていないため、外部キー制約の親キーの要件がわかります。

いずれかの列に一意の値を保持せずに、すべての値が別の表の列に既に存在する必要があるように、表の1列を制約する方法はありますか?

+0

は、process1テーブル内のすべての項目がprocess2テーブルになりますか? – happymacarts

+0

@happymacartsはい彼らは – joeqesi

+0

あなたはテーブルの構造を変更することができます私は何かこれを行う可能性があります:製品ID、p1_start_date、p1_end_date、p2_start_date、p2_end_date、...それは動作しない限りすべて1つのテーブル内のすべて – 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 
関連する問題