2017-06-14 41 views
1

我並不是超級好的SQL,但是我將它用於項目。下面是我想編寫查詢,但當然這不是有效的SQL如何獲取「不存在」查詢的最大值

select * from a 
where not exists (
    select * from b 
    where a.name = b.name) common 
where a.id > max(common.id) 

我的目標是獲得a行不與那些在b加入,但只有那些具有更大id比任何加入的人。關鍵是這樣,我可以開始用值填充數據庫,停止,然後在我離開的地方繼續。

我使用python的sqlite;我知道我可以做兩個查詢與Python,但我猜有一種方法用SQL做到這一點(我假設這是「好」)

轉儲:

BEGIN TRANSACTION; 
CREATE TABLE "a" (
    `Id` INTEGER NOT NULL UNIQUE, 
    `Name` TEXT, 
    PRIMARY KEY(`Id`) 
); 
INSERT INTO a VALUES(16,'Bob'); 
INSERT INTO a VALUES(17,'George'); 
INSERT INTO a VALUES(18,'Jimmy'); 
INSERT INTO a VALUES(19,'Billy'); 
INSERT INTO a VALUES(20,'Johnny'); 
INSERT INTO a VALUES(21,'James'); 
INSERT INTO a VALUES(22,'Bart'); 

CREATE TABLE "b" (
    `Id` INTEGER NOT NULL UNIQUE, 
    `Name` TEXT NOT NULL, 
    PRIMARY KEY(`Id`) 
); 
INSERT INTO b VALUES(16,'Bob'); 
INSERT INTO b VALUES(19,'Billy'); 
COMMIT; 

有其他列,所以這些不是相同的表,但查詢應該從表a得到Johnny,James和Bart。

+0

請提供爲[MCVE]一個'.dump' SQLite中適當定製玩具數據庫。 – Yunnosch

+0

@Ynnosch編輯 – phil

+0

@CL。最後一句應該足夠清楚,如果不是? – phil

回答

1

我建議:

  • 做出內方便的公共表表達式加盟(第一行)
  • 選擇所有不在ab中的所有(第二行和第四行)
  • 根據所需條件限制(第三行)

請注意,來自ab的ID與來自a的ID相同,其與b一起加入。所以他們的最大值是來自某個連接的ID的最大值。

我只是輸出*,只使用所需的字段是可能的應該很容易。

代碼:

with ab(id, field) as (select id, a.name from a join b using(id)) 
select * from a 
where id > (select max(id) from ab) 
except select * from ab; 

輸出:

20|Johnny 
21|James 
22|Bart 
0

下會從ab行比最大的相應值大的所有行:

select a.* 
from a 
where a.id > (select max(b.id) from b where a.a_field = b.b_field) 

它假定至少一個記錄在b匹配。

如果要包括所有值,即使沒有這樣的話,我認爲這會做:

select a.* 
from a 
where a.id > all (select b.id from b where a.a_field = b.b_field) 
+0

有趣;這很接近,但我不認爲這正是我想要的。我的問題有點含糊,但我想再次比較'a.id'和'a.id',而不是'b.id'。我想我會以某種方式看到一種加入方式,但我不確定。 – phil

相關問題