sqlite rownum




Come ricevere due valori da un SQLite sottoquery (2)

Non hai bisogno di una sub-query. Hai bisogno di join:

SELECT p.id, p.first_name, p.last_name, p2.id as pet_id, p2.name as pet_name
FROM person as p
INNER JOIN person_pet as pp on pp.person_id = p.id
INNER JOIN pet as p2 on p2.id = pp.pet_id
WHERE 
p2.purchased_on > '2004/01/01 0:0:0 AM'

Sono un autoapprendimento e novizio in SQLite. Ho tre tavoli (persona, animale domestico, persona_petita) e il .schema è:

CREATE TABLE person (
id INTEGER PRIMARY KEY,
first_name TEXT,
last_name TEXT,
age INTEGER,
dead INTEGER,
phone_number INTEGER,
salary FLOAT,
dob DATETIME
);

CREATE TABLE person_pet (
    person_id INTEGER,
    pet_id INTEGER,
    );

CREATE TABLE pet (
    id INTEGER PRIMARY KEY,
    name TEXT,
    breed TEXT,
    age INTEGER,
    dob DATETIME,
    purchased_on DATETIME,
    parent INTEGER /*Contains the ID of the pet's parent*/
    );

Il mio compito è scrivere una query in grado di trovare tutti i nomi degli animali domestici e dei loro proprietari acquistati dopo il 2004. La chiave per fare questo è mappare la persona_pet in base alla colonna purchase_on con l'animale domestico e il genitore. Ho provato a fare una subquery che restituisce due valori ma non funziona. (Alcuni di voi direbbero: "Ovviamente".) La mia domanda è: se non riesco a restituire due valori da una sottoquery, come posso ottenere questo compito?

Ho provato questa subquery:

SELECT first_name, name FROM person, pet WHERE person.id pet.id IN(
SELECT person_id FROM person_pet WHERE pet_id IN (
SELECT id FROM pet WHERE purchased_on IN (
SELECT pet.purchased_on
FROM pet, person_pet, person
WHERE person.id = person_pet.person_id AND
pet.id = person_pet.pet_id AND
pet.purchased_on > '2004/01/01 0:0:0 AM'
)
)
SELECT pet_id FROM person_pet WHERE id IN (
SELECT id FROM pet WHERE purchased_on IN (
SELECT pet.purchased_on
FROM pet, person_pet, person
WHERE person.id = person_pet.person_id AND
pet.id = person_pet.pet_id AND
pet.purchased_on > '2004/01/01 0:0:0 AM'
)
)
);

PS: Scusa se la mia domanda è un po 'lunga.


Se vuoi davvero farlo con le sottoquery, puoi farlo in questo modo:

SELECT (SELECT first_name
        FROM person
        WHERE id = person_pet.person_id),
       (SELECT name
        FROM pet
        WHERE id = person_pet.pet_id)
FROM person_pet
WHERE pet_id IN (SELECT id
                 FROM pet
                 WHERE purchased_on >= '2004');

Ma i join potrebbero essere più efficienti.





sqlite3