2016-06-25 38 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随机选择。 –