sql - tabla - para que es la libreria pandas
Escritura de consultas SQL JOIN (5)
Intento escribir una consulta simple que involucre dos tablas. La tabla "persona" tiene un person_id
único y un name
, y la tabla "friends" tiene un person_id
y un friend_id
que es un FK a un person_id
en la tabla de personas.
person:
<PK> int person_id
varchar[45] name
friends:
<PK> int person_id
<PK> int friend_id
Quiero seleccionar el nombre de todos los amigos de la persona 1.
Puedo hacer esto fácilmente usando una declaración IN
:
SELECT p.name FROM person p WHERE p.person_id IN (SELECT f.friend_id FROM friends f WHERE f.person_id = 1);
Sin embargo, no soy competente escribiendo declaraciones de JOIN
. ¿Alguien puede ayudarme a escribir la unión equivalente?
Claramente, este es un ejemplo artificial, pero lo he intentado con mis datos reales y, conceptualmente, me falta algo. Gracias.
Estoy bastante seguro de que Tony Andrews lo hizo bien, excepto que creo que la sintaxis correcta pone la tabla fuente a la izquierda y la tabla unida a la derecha ...
SELECT p.name FROM person p
INNER JOIN friends f ON p.person_id = f.friend_id
WHERE f.person_id = 1
Esto devolverá el campo [person.name]
de todos los registros donde el valor [person.person_id]
se encuentre en el campo [friends.friend_id]
Y los campos [friends.person_id]
iguales a 1. ... todos los que sean amigos de [1] existirá en la tabla de personas filtradas cuando estén unidas y se limite a friends.person_id=[1]
Quieres algo como esto:
SELECT p.name, f.friend_id
FROM person AS p
INNER JOIN friends AS f ON p.person_id = f.person_id
WHERE p.person_id = 1
Esto une las dos tablas usando p.person_id = f.person_id
Si una persona no tiene amigos, no recibirá ninguna fila; si no quiere esto, utilice LEFT JOIN y obtendrá una fila con NULL friend_id
.
Editar: si quieres volver a unirte a tus amigos:
SELECT p.name AS person_name, friend.name AS friend_name
FROM person AS p -- Our person
INNER JOIN friends AS f ON p.person_id = f.person_id -- the join table
INNER JOIN person AS friend on f.friend_id = friend.id -- Join back on person again
WHERE p.person_id = 1
Tal vez necesites una unión de 3 vías como esta para tu aplicación, pero más generalmente solo necesitarías una de 2 vías como la anterior, o algo así:
SELECT p.name, f.friend_id
FROM person AS p
INNER JOIN friends AS f ON p.person_id = f.friend_id
WHERE f.person_id = 1
Esto le dará los nombres de todas las personas que son amigos con person_id 1 (pero no el nombre de person_id 1)
SELECT p.name FROM person p
INNER JOIN friends f ON f.friend_id = p.person_id
WHERE f.person_id = 1;
select
p.name,
p2.name as friend_name,
from
person p
inner join friends f on p.person_id = f.person_id
inner join person p2 on f.friend_id = p2.person_id -- friends
where
p.person_id = <your criteria>
select p.name from person p, friends f where f.friend_id = p.person_id and f.person_id = 1