2016-11-22 94 views
0

我有三個表,如數據,飽和度,值,其中:SQL連接而無需多行

CREATE TABLE DATA(
    data_id INT AUTO_INCREMENT, 
    PRIMARY KEY(data_id) 
); 

CREATE TABLE VALUE(
    value_id INT AUTO_INCREMENT, 
    data_id INT, 
    sample INT, 
    channel_1 DOUBLE, 
    channel_2 DOUBLE, 
    channel_3 DOUBLE, 
    PRIMARY KEY (value_id), 
    FOREIGN KEY(data_id) REFERENCES DATA(data_id) 
); 

CREATE TABLE SATURATION(
    saturation_id INT AUTO_INCREMENT, 
    data_id INT, 
    sample INT, 
    channel_1 INT CHECK (channel_1 >= 0 AND channel_1 <= 1), 
    channel_2 INT CHECK (channel_2 >= 0 AND channel_2 <= 1), 
    channel_3 INT CHECK (channel_3 >= 0 AND channel_2 <= 3), 
    PRIMARY KEY (saturation_id), 
    FOREIGN KEY(data_id) REFERENCES DATA(data_id) 
); 

我已經查詢關鍵詞,比如:

SELECT s.sample AS 'S Sample', s.channel_1 AS '#Ch_1 S', s.channel_2 AS '#Ch_2 ES', s.channel_3 AS '#Ch_3 ES', 
    v.sample AS 'V Sample', v.channel_1 AS '#Ch_1 V', v.channel_2 AS '#Ch_2 V', v.channel_3 AS '#Ch_3 V' 
FROM VALUE v 
    LEFT OUTER JOIN SATURATION s 
    ON v.data_id = s.data_id 
    WHERE s.sample = v.sample AND s.data_id = 1; 

結果是好的,如果數量樣本在一個系列中是相等的。但我想要這樣的事情:

 
----------- 
| ES Sample | #Ch_1 ES | #Ch_2 ES | #Ch_3 ES | EV Sample | #Ch_1 EV | #Ch_2 EV | #Ch_3 EV | 
----------- 
| 1 | 1 | 0 | 1 | 1 | 114.5 | 10.2 | 114.5 | 
----------- 
| 2 | 0 | 0 | 1 | 2 | 114.5 | 10.2 | 114.5 | 
----------- 
| 3 | 0 | 0 | 1 | 3 | 114.5 | 10.2 | 114.5 | 
----------- 
| 4 | 1 | 0 | 1 | 4 | 114.5 | 10.2 | 114.5 | 
----------- 
| null | null | null | null | 5 | 114.5 | 10.2 | 114.5 | 
----------- 

如何做到這一點?通常沒有子句's.sample = v.sample'我得到this。我不想在一個表中存儲飽和度和價值,但我猜這是非常簡單和愚蠢的解決方案。

UPDATE:

下面是其產生result因爲我想(如果我比飽和度在同一系列中有多個值)的查詢:

SELECT v.data_id AS 'V ID', s.data_id AS 'S ID', s.sample AS 'S Sample', s.channel_1 AS '#Ch_1 S', s.channel_2 AS '#Ch_2 S', s.channel_3 AS '#Ch_3 S', 
    v.sample AS 'V Sample', v.channel_1 AS '#Ch_1 V', v.channel_2 AS '#Ch_2 V', v.channel_3 AS '#Ch_3 V' 
FROM SATURATION s RIGHT JOIN VALUE v ON v.sample = s.sample 
WHERE (v.data_id = 1 OR s.data_id IS NULL) AND (s.data_id = 1 OR s.data_id IS NULL); 
+0

是一個樣的事情,這可能是有價值的數據和飽和度數據或兩者(您可能要添加一個樣品表,FK這兩個值和飽和度表,並從該驅動器的查詢,左側的接合部的其他表),還是每個類型都是一個單獨的樣本? (在這種情況下,你正在做的是獲得兩個不相關的系列,並將它們並排放在一起?然後一個FULL OUTER JOIN可能會做你所問的,但可能不是真正的解決方案,這可能是應該在應用程序中完成的事情層不是SQL –

+0

@JamesCasey,樣品是可能有值數據與飽和或兩者兼而有之。但有時我們可能會失去價值/ satur的樣品的事情。當我們從設備收集數據,因此應用層應合併這兩個查詢下面與8列一個表?正如我想要的嗎? '選擇es.sample AS 's採樣',s.channel_1 AS '#CH_1 S',s.channel_2 AS '#CH_2 S',s.channel_3 AS「 #Ch_3 S' FROM SATURATION s WHERE s.data_id = 1;' 'SELECT v.sample AS'V Sample',v.channel_1 AS'#Ch_1 V',v.channel_2 AS'#Ch_2 V',v .channel_3 AS'#Ch_3 V' FROM值V WHERE v.data_id = 1;' – BlueJack

回答

0

我將創建數據之間的示例表價值和飽和度。因此,數據會有許多樣品,每個將具有零個或一個值和零個或一個飽和記錄

然後從該試樣臺驅動查詢,左側的接合部,以價值和飽和度。

讓我知道這是沒有意義的,我會盡量澄清,但希望你明白我的意思。

+0

呀,可能這將是罰款,解決我的優雅方式的問題,但我我想出了其產生的結果,因爲我想查詢。我已經更新了第一篇文章。你可以看看! – BlueJack

+0

我認爲你剛剛扭轉了問題,通過做正確的連接,而不是左連接,你現在會得到一個問題,如果有更多的飽和度比值(或其他方式:)) - 你可以使用FULL OUTER JOIN獲得什麼你希望通過哪種方式處理丟失的數據 –