2012-10-01 29 views
2

考慮下表:如何連接2個同表查詢結果在SQLite中保存唯一鍵?

CREATE TABLE `foo`(
    `aaa` VARCHAR(45) NOT NULL, 
    `bbb` VARCHAR(45) NOT NULL, 
    `ccc` INT NOT NULL, 
    `ddd` INT NOT NULL, 
    PRIMARY KEY(`aaa`, `bbb`, `ccc`) 
); 

以下數據:

INSERT INTO `foo` (`aaa`, `bbb`, `ccc`, `ddd`) 
VALUES 
('qwe', 'rty', 0, 123), 
('asd', 'fgh', 0, 456), 
('asd', 'fgh', 1, 678); 

以下結果要得到:

'qwe', 'rty', 0, 123 
'asd', 'fgh', 1, 678 

的目的是讓

  • 只有一個重新線每個(aaabbb)密鑰對
  • ccc = 1青睞記錄,如果有超過1只記錄了(aaabbb)表

所以我想我需要連接結果密鑰對套2個的查詢:

SELECT * FROM `foo` WHERE `ccc` = 1 

SELECT * FROM `foo` WHERE `ccc` = 0 

當第一個查詢結果中已經有相同的密鑰對行(aaa,bbb)時,丟棄第二個查詢結果行。

如何在SQLite中進行編碼?

+1

不SQLite的允許'IN'條款,如'CCC IN(0,1)'?如果是這樣,那麼你可以將你的查詢重寫爲'SELECT DISTINCT aaa,bbb FROM foo WHERE ccc IN(0,1)'。 – Vikdor

+0

@Vikdor我不確定它是否支持這一點,會嘗試,但我需要完整的記錄,並且只有ccc = 1的記錄,如果ccc = 1和ccc = 0版本的同一記錄存在,我懷疑你的查詢是否(可能的確如此,在此之前我還沒有任何SQLite體驗)。 – Ivan

+1

你可以通過加入一個對每個'aaa'和'bbb'具有最大值的子查詢來做到這一點。請參閱下面的答案。 –

回答

2

試試這個,

SELECT a.* 
FROM foo a 
     INNER JOIN 
     (
      SELECT aaa, bbb, MAX(ccc) maxC 
      FROM foo 
      GROUP BY aaa, bbb 
     ) b ON a.aaa = b.aaa AND 
       a.ccc = b.maxC AND 
       a.bbb = b.bbb 

SQLFiddle Demo

+0

似乎工作,@ john-woo。讓我們看看它將如何發展大數據(真正的數據庫將大約爲1.5 GiB)。我一直認爲JOIN是爲了水平連接表(將不同表中的列結合在一個更寬的表中),但不知道它也是垂直的。順便說一句,試圖理解查詢,我不明白'b'是如何定義的:你只需加入一些神祕的'b'和地址'b'列的查詢結果,但是我們如何得到'b '? – Ivan

+0

我爲'b'命名的子查詢對於每一對'aaa'和'bbb'獲得'ccc'的最大值。在達到最大值後,它會加入到原始表中,只要列'aaa','bbb'和新找到的最大值'ccc'必須匹配所有條件。嘗試只運行子查詢,看看結果是什麼:D –

+1

哦,我現在看到,'b'被定義在它之前的括號中。 – Ivan

相關問題