2016-06-25 83 views
0

我有三個不同的表:人,person_pet和PETSQL更新查詢填充從第一行只有第一個值

create table person ( 
    id integer primary key, 
    name text 
); 

create table person_pet (
    person_id integer, 
    pet_id integer primary key 
); 

create table pet (
    id integer primary key, 
    breed text, 
    owner integer 
); 

在那之後,我插入一些值:

insert into person (id, name) 
    values (0, "Name1"), (1, "Name2"), (2, "Name3"); 

insert into person_pet (person_id, pet_id) 
    values (0,1), (1,0), (2,3), (1,2); 

insert into pet (id, breed, owner) 
    values (0, "PetA", null), (1, "PetB", null), (2, "PetC", null), (3, "PetD", null); 

我想將表pet中owner列的數據更新爲person_pet表中顯示的所有者的實際id。也就是說,我希望得到以下結果:

PET表

id breed owner 
0  PetA  1 
1  PetB  0 
2  PetC  1 
3  PetD  2 

我試圖用一個選擇的子查詢這個SQL查詢:

update pet set owner = (
    select person.id 
    from person, person_pet, pet 
    where person.id = person_pet.person_id and 
    person_pet.pet_id = pet.id 
); 

這產生這個輸出(在只有ID填充一個所有者):

PET表

id breed owner 
0  PetA  1 
1  PetB  1 
2  PetC  1 
3  PetD  1 

如果我運行它自己的子查詢,

select person.id 
    from person, person_pet, pet 
    where person.id = person_pet.person_id and 
    person_pet.pet_id = pet.id; 

,我希望出現的結果:

PET表

id breed owner 
0  PetA  1 
1  PetB  0 
2  PetC  1 
3  PetD  2 

但我不使用時,設法讓這更新命令。

+2

哪個'DBMS'?因爲對於每個DBMS,JOIN語法的UPDATE不同。 – Arulkumar

+0

@Arulkumar,它是SQLite3。 –

+0

我知道的唯一方法是在'pet'表中替換'值',同時通過'select'查詢插入新數據,而不是使用'values'語法。 –

回答

0

我做這個測試的SQL Server解決方案, 可以幫助你:

update pet set owner = person.id 
from pet inner join person_pet on pet.id = person_pet.pet_id 
inner join person on person.id = person_pet.person_id 

與此輸出:

id breed owner 
0 PetA 1 
1 PetB 0 
2 PetC 1 
3 PetD 2 
+0

如果我沒有錯,SQLite3中的'update'不支持'from'子句。我忘了提及它是sqlite3--我請求借口。 –

0

SQLite的,請嘗試以下格式:

UPDATE pet 
SET owner = (
     SELECT PER.id 
     FROM person PER 
     INNER JOIN person_pet PPE ON PPE.person_id = PER.id 
     INNER JOIN pet PET ON PET.id = PPE.pet_id) 
WHERE id IN (SELECT id FROM pet); 
+0

同樣的結果出現。只填寫一個所有者的ID。 –

+0

從我收集的內容中,當'select'是表達式的一部分時,它只返回列表中的一個值 - 並且此值可能由sqlite隨機選擇。 –