2017-08-06 127 views
1

我有兩個文件,每列有三列。來自兩個表格的三列值之間的差異

data1.txthttps://pastebin.com/ezVr6KPi

# P (Gpa)  G/F. unit (a.u.)  T (K) 
-4.4119598462100 -941.5590019525371 10.0000000000000 
-4.4115664473800 -941.5589977004460 30.1000000000000 
-4.4084485632200 -941.5589688036446 50.2000000000000 
-4.3989188608700 -941.5588816009147 70.3000000000000 
... 

data2.txthttps://pastebin.com/veqBi8Er

# P (Gpa)  G/F. unit (a.u.)  T (K) 
7.5789845745700 -941.3858364185293 10.0000000000000 
7.5936983738200 -941.3856461092793 30.1000000000000 
7.6147899594200 -941.3853929461748 50.2000000000000 
7.6413267974900 -941.3851062350891 70.3000000000000 
... 

我已經在tables.sql腳本創建2個表,並命名爲列:

.headers on 

CREATE TABLE C_I("P1" TEXT, "G1" TEXT, "T1" TEXT); 
CREATE TABLE C_II("P2" TEXT, "G2" TEXT, "T2" TEXT); 

我導入數據:

.separator " " 

.import './data1.txt' C_I 
.import './data2.txt' C_II 

然後我從文件中刪除原始標題,只是指更好地上面給出的列名:G1T1

select T1 from C_I LIMIT 3; 
select P1 from C_I LIMIT 3; 
select G1 from C_I LIMIT 3; 

DELETE FROM C_I WHERE T1 == '(Gpa)'; 
DELETE FROM C_I WHERE P1 == '#'; 
DELETE FROM C_I WHERE G1 == 'P'; 

DELETE FROM C_II WHERE T2 == '(Gpa)'; 
DELETE FROM C_II WHERE P2 == '#'; 
DELETE FROM C_II WHERE G2 == 'P'; 

select * from C_I LIMIT 3; 
select * from C_II LIMIT 3; 

我想獲得的P1值,,, P2G2T2,其中:

P1 = P2(內的閾值)ANDT1 = T2(在閾值內)ANDG1 = G2(在閾值內)。

爲此,我做的事:

更新:

選項1:

SELECT * FROM C_I l1, C_II l2 
WHERE 
    ABS(l1.P1-l2.P2) < 0.005 
    AND 
    ABS(l1.T1-l2.T2) < 20.0 
    AND 
    ABS(l1.G1-l2.G2) < 0.005 

這將打印以下錯誤:

Error: incomplete SQL: SELECT * FROM C_I l1, C_II l2 
WHERE 
    ABS(l1.P1-l2.P2) < 0.005 
    AND 
    ABS(l1.T1-l2.T2) < 20.0 
    AND 
    ABS(l1.G1-l2.G2) < 0.005 

選項2:添加;

SELECT * FROM C_I l1, C_II l2; 
WHERE 
    ABS(l1.P1-l2.P2) < 0.005 
    AND 
    ABS(l1.T1-l2.T2) < 20.0 
    AND 
    ABS(l1.G1-l2.G2) < 0.005 

在這種情況下,整個的兩個表顯示通過終端, ,顯然此代碼已沒有作用。即使我在這三條語句中將閾值設置爲0.0,也會發生相同的情況(如果閾值爲0.0,則不會產生輸出)。

OPTION 3:作爲@Myonara建議,增加;這裏:

SELECT P, G, T FROM C_I l1 , C_II l2 
WHERE 
    ABS(l1.P1-l2.P2) < 0.005; 
    AND 
    ABS(l1.T1-l2.T2) < 20.0 
    AND 
    ABS(l1.G-l2.G2) < 0.005 

產生這個錯誤:

Error: incomplete SQL: AND 
    ABS(l1.T1-l2.T2) < 20.0 
    AND 
    ABS(l1.G1-l2.G2) < 0.005 

因此,這是我無法理解的是不工作

我希望你能幫助我。

完整的腳本:tables.sql

我運行它爲:sqlite3 < tables.sql

.headers on 

CREATE TABLE C_I("P1" TEXT, "G1" TEXT, "T1" TEXT); 
CREATE TABLE C_II("P2" TEXT, "G2" TEXT, "T2" TEXT); 

.separator " " 

.import './data1.txt' C_I 
.import './data2.txt' C_II 


select T1 from C_I LIMIT 3; 
select P1 from C_I LIMIT 3; 
select G1 from C_I LIMIT 3; 


DELETE FROM C_I WHERE T1 == '(Gpa)'; 
DELETE FROM C_I WHERE P1 == '#'; 
DELETE FROM C_I WHERE G1 == 'P'; 

DELETE FROM C_II WHERE T2 == '(Gpa)'; 
DELETE FROM C_II WHERE P2 == '#'; 
DELETE FROM C_II WHERE G2 == 'P'; 


select * from C_I LIMIT 3; 
select * from C_II LIMIT 3; 


SELECT * FROM C_I l1, C_II l2; 
WHERE 
    ABS(l1.P1-l2.P2) < 0.005 
    AND 
    ABS(l1.T1-l2.T2) < 20.0 
    AND 
    ABS(l1.G1-l2.G2) < 0.005 
+0

您可能需要在最後一個查詢分號 – Ali

+0

@Ali是的,我在最後一個查詢中添加了';',結果是整個2個表都通過終端出現。即使我在三種情況下將容差設置爲'0.0',它也會發生相同的情況 - 請參見更新 –

+2

爲什麼要在此查詢中輸入';'SELECT * FROM C_I l1,C_II l2;',然後繼續執行WHERE '子句?他們是一個查詢嗎? – Ikrom

回答

1

試試這一個,因爲只有這個是完整的SQL語法SELECT,你需要:

SELECT P, G, T FROM C_I l1 , C_II l2 
WHERE 
    ABS(l1.P-l2.P) < 0.005 
    AND 
    ABS(l1.T-l2.T) < 20.0 
    AND 
    ABS(l1.G-l2.G) < 0.005; 
+0

感謝您的回答。當我運行代碼時,我收到以下消息:'預計3列,但發現22 - 額外忽視'你知道爲什麼會發生這種情況嗎? –

+0

不,谷歌搜索後「額外忽略sqilite」沒有「我得到一些暗示csv文件的導入,也許這有助於。 – Myonara

1

根據您的意見,這是適合您的腳本:

SELECT l1.p1, l2.p2, l1.t1, l2.t2, l1.g1, l2.g2 FROM C_I l1, C_II l2 WHERE ABS(l1.P1-l2.P2) < 0.005 AND ABS(l1.T1-l2.T2) < 20.0 AND ABS(l1.G1-l2.G2) < 0.005;

我會解釋這是什麼做的這個腳本: - 在這裏它只是創造一個笛卡爾乘積(也被稱爲交叉聯接),只要你想。這意味着它將提供一個具有680.000行(400行* 1700行= 680.000行)的表格,將提供for each record from table C_I1700 records from table C_II; 2.在WHERE條款它會做計算,並從腳本,你有only one (1) match所有your 3 conditions那裏; 3.例如,只有在這種情況下ABS(l1.P1-l2.P2) < 0.005你有91 matches,如果你應用第二個,那麼只有1匹配;

希望它能幫助你!