[SQL Server] Sacar registros de varias tablas

ArcheR

Buenas.

Resumiendo para no liarme mucho, el tema es que tengo varias tablas, todas con la misma estructura, pero con datos distintos. Siendo registros de personas, hay personas que tienen registros en varias de esas tablas, por lo que me gustaría saber si con una única consulta SQL se pueden sacar todos los registros de todas esas tablas que pertenezcan a esa persona.

Gracias!

HoTiTo

http://es.wikipedia.org/wiki/Join

1
ArcheR

He probado y reprobado con join pero no encuentro la forma de hacer lo que he explicado antes. Sabes de algún ejemplo más práctico y, a poder ser, similar a lo que yo planteo para aclarármelo?

HoTiTo

Si no entiendo mal, tienes varias tablas unidas por un mismo identificador (la persona).

Pongamos que tienes TABLA1 y TABLA2:

SELECT tabla1.datoquequierasm, tabla2.datoquequieras, ... FROM TABLA1 INNER JOIN TABLA2 ON tabla1.persona = tabla2.persona;

¿Eso no te vale?

ArcheR

Voy a explicarme de forma algo más detallada a ver si se me entiende. Tengo dos tablas tal que así:

TABLA1
ID = Identificador del registro, es automático
IDDirector
IDRol
IDEpisodio

TABLA2
ID = Identificador del registro, es automático
IDDirector
IDRol
IDEpisodio

Como ves, la estructura es exactamente igual, sin embargo, ambas tienen registros completamente distintos. NO HAY ninguna fila que sea igual entre ambas tablas, todas son distintas de todas.

Pues yo quiero digamos sacar de ahí una "tabla virtual" nueva con todos los registros de ambas tablas en los que el IDDirector = 3 (por ejemplo). Vamos, que me saque todos los registros de la TABLA1 donde el IDDirector = 3, después me saque todos los de la TABLA2 donde IDDirector = 3 y me los ponga todos juntos en una nueva tabla.

HoTiTo

SELECT * FROM TABLA1 INNER JOIN TABLA2 ON tabla1.IDDirector = 3 AND tabla2.IDDirector = 3 ?

Edit: ¿Quieres crear una nueva tabla en la BD con esos datos o has hablado figuradamente?

ArcheR

Sí pero no. Yo ya, para ayudarme a comprobar si los resultados de las consultas que pruebo son correctas o no, he hecho las consultas de una tabla y otra por separado, y de ese director hay 25 registros en total entre las dos tablas.

Pues al hacer la consulta que me has dicho, me saca 126 registros. Además, que creo que por ahí va el problema, el resultado de la consulta me saca las columnas repetidas de una y de otra tabla. Vamos, me saca repetidas las columnas, porque me saca el campo ID de cada tabla, el campo IDDirector de cada tabla, el campo IDRol de cada tabla y el campo IDEpisodio de cada tabla, mientras que lo que busco es que me "extraiga" las tablas con ese IDDirector de cada tabla y simplemente después "pegue" los resultados de una tabla debajo de la de otro.

Yo pienso que lo que busco no existe xD

Lo de crear una tabla nueva no es literal, vamos xD Cuando hablo de la tabla nueva realmente me refiero a los resultados de la consulta.

ArcheR

Para intentar explicarlo aún mejor, pongo ésto:

Sacar los registros de ambas tablas en las que el IDDirector = 3

REGISTROS TABLA1

ID | IDDirector | IDEpisodio | IDRol

1056 | 3 | 62 | 4
1041 | 10 | 41 | 7
1013 | 8 | 22 | 2
1621 | 3 | 46 | 5

REGISTROS TABLA2

ID | IDDirector | IDEpisodio | IDRol
1085 | 7 | 85 | 5
1162 | 3 | 63 | 1
1633 | 1 | 11 | 6
1246 | 15 | 32 | 9

LO QUE QUIERO QUE ME SAQUE LA CONSULTA AL FINAL

ID | IDDirector | IDEpisodio | IDRol
1056 | 3 | 62 | 4
1621 | 3 | 46 | 5
1162 | 3 | 63 | 1

HoTiTo

Comprendo lo que dices, ¿pero qué más da tenerlos resultados pegados unos debajo de otro que tener todas las columnas repetidas?

Tú necesitas la información para algo en particular y puedes acceder a ella de la forma tabla1.campo o tabla2.campo. Luego la formateas y la presentas como tú quieras.

O sea, para que nos entendamos. Esa consulta que te he hecho te da toda la información que necesitas, pero no te gusta porque porque en vez de apilarte los resultados por columnas con el mismo nombre, te aparecen las columnas una al lado de la otra con el mismo nombre.

Como te he dicho, tu a la db le pides la información, y luego una vez la obtienes la formateas como tú quieras para imprimirla por pantalla.

ArcheR

Hombre, la estructura a mi me ayudaría mucho porque después tengo que enlazar esos campos de lo resultante con otras tablas porque los campos finales a enseñar están en otras tablas y demás, pero bueno.

Aún dándome igual eso, ya te digo que con la consulta de antes me ha sacado 126 registros, cuando ese director tiene, entre ambas tablas, 25 registros suyos :\

HoTiTo

Seguiré pensando en tu problema. Es solo cuestión de ponerse en plan profundo con SQL xD

Yandr0s

SELECT * FROM TABLA1 INNER JOIN TABLA2 ON tabla1.IDDirector = tabla2.IDDirector
WHERE tabla1.IDDirector = 3

p.d. puedes explicar por que tienes 2 tablas iguales??? :S:S

p.d.2.ah copon, que tienen que salir en filas distintas...

p.d.3 Y por que no puedes hacer dos consultas?? :S

1 respuesta
ArcheR

Hombre, supongo que habrá ALGUNA forma de sacarlo, pero claro, no tengo los conocimientos como para eso xD

#12, tu consulta me saca lo mismo que la de HoTiTo, 126 resultados xDD

Lo de las dos tablas, pues puede que sea una estupidez que hice. El tema es que sí, en principio tenía los registros de ambas tablas en una sola tabla, y claro, ahí estaba tirado hacer lo que quiero hacer, pero es que en esa tabla se iban (y se van) añadiendo registros casi a diario, y la cosa va ya por 27000. Me han dicho que el máximo que soportará la tabla es de unos 60 y pico mil, por lo que al ritmo que voy, puede que en cosa de un par de meses llegue a eso, y para evitar quedarme sin registros, he separado los registros de esa tabla en "subtablas" por orden alfabético.

Porque cada registro de esa tabla está asociado a una serie, entonces ahora tengo la tabla "registros_A" donde van todos los registros que pertenecen a series que empiecen por la letra A, después "registros_B" con todos los registros de series que empiecen por B, y así sucesivamente, de tal forma que los registros se reparten y me permiten multiplicar las posibilidades.

El problema de ésto que he hecho es que, aunque el ejemplo de antes lo he puesto con dos tablas solo, en realidad voy a necesitar hacerlo entre 10 o 15 tablas, así que me suena a imposible xD Porque claro, al final, para ver por ejemplo los registros del director con IDDirector = 3, tengo que ir a las tablas de todas las letras y sacar de cada una los registros de ese director (si hay, claro) xD

1 respuesta
HoTiTo

No entiendo una restricción así. Límite de tamaño a una BD sí es lógico, ¿pero a una tabla?

Haces varias tablas diferentes como has hecho tú y trolleas al que te ha puesto ese límite. ¿Seguro que es por tabla?

Además, 60 000 no me parece un número escandalosamente alto.

1 respuesta
ArcheR

Entonces tú crees que podré seguir añadiendo filas a esa tabla única sin problemas? Sé que, claro está, los campos sí tienen límite dependiendo del tipo que sea, pero por eso no creo tener problemas, porque el número más alto que habrá será el del campo ID, el que es autonumérico, pero al ser bigint, el límite está en 9,223,372,036,854,775,807, y hombre, se añade mucho, pero no creo llegar a eso xDD

Si no hay límite de filas en una tabla, se acabaría el problema!

Eso sí, hablando de ese tema, y el hecho de hacer lo que he hecho de dividir los registros en varias tablas, no aceleraría una búsqueda? Supongo que no es lo mismo buscar entre 5.000 registros que entre 50.000.

1 respuesta
Yandr0s

#14 60000 es un numero bajisimo, yo tampoco lo entiendo :S

#13 puedes decirnos mas o menos que sacan esos 126 resultados?? esta sacando alguno repetido? o alguno que no deberia sacar??

Puede existir una fila identica en ambas tablas???

has probado a usar DISTINCT?

Joder ahora me toy rallando XD

#15 pues yo creo que practicamente lo mismo XD

que tipo de base de datos estas usando??

p.d. por ejemplo:

Limitations of the MyISAM storage engine

There is a limitation of 232 (4.2 Mia) rows in a MyISAM table. You can increase this limitation if you build MySQL with the --with-big-tables option then the row limitation is increased to 264 (1.8 * 1019) rows.

ArcheR

Pues respecto a lo de los 126 resultados, por lo que veo en los resultados, lo que hace es que por cada resultado válido de una de las tablas, me repite de la otra tabla. Ahora pego una imagen a ver si se ve algo mejor. Respecto a lo de filas idénticas, no, te puedo asegurar que TODAS son distintas.

Lo del tipo de base de datos, en qué sentido? No es en local, es una hospedada en dinahosting.

En esa imagen están parte de los resultados (en realidad no es el IDDirector = 3, sino IDDirector = 658). Si te das cuenta, del registro 1 al 7, los "segundos" ID son distintos, van del 6184 al 6190, después sin embargo aumenta uno al primer ID y repite los mismos segundos, después hace lo mismo y así, y por eso saca tantos.

1 respuesta
Yandr0s

#17 CUal es el campo que las distingue? el ID?

Pues prueba con:

SELECT DISTINCT ID,IDDirector,IDEpisodio,IDRol FROM TABLA1 INNER JOIN TABLA2 ON tabla1.IDDirector = tabla2.IDDirector
WHERE tabla1.IDDirector = 3 NAD tabla2.IDDirector = 3

#19 cagonlaputa >_> como no puede ocurrirseme nada :/

1 respuesta
ArcheR

No puedo realizar esa consulta porque me indica que los campos del SELECT son ambiguos (claro, están em ambas tablas). El campo ID es distinto para todos los registros, sí.

#18, na, déjalo. Si el límite de registros en una tabla es muy grande, pues tiraré así y cuando me pete y no pueda añadir más ya pensaré algo xD Gracias de todas formas a ambos!

2 respuestas
Yandr0s

#19 esque en teoria el limite es una animalada de numero, como puse arriba.

Es mas, en muchos sistemas creo que nisiquiera hay limite

HoTiTo

Desde la perspectiva de la base de datos, es indiferente tener 20 tablas con 10 registros que una tabla con 200 registros.

Donde perderás rendimiento es en las consultas, que tienes que hacer unas consultas más raras que mis cojones peludos para poder sacar la información.

Así que te aconsejo que uses una única tabla. El límite de 60 000 registros es una estupidez. Creo recordar que 5 000 registros son alrededor de 5 mbs (depende del tipo de registros, pero vamos, aproximando). Una base de datos de 60 mbs es algo así como una mierda pinchada en un pelo, no tiene por qué tener ningún tipo de problema.

Khanser

Edit: No he dicho nada, con una join y a tomar por culo xD

Soltrac

Lo de 60.000 es mentira, tu diseño de tablas es lo más penoso que he visto en mi vida.

Una vez dicho esto, prueba con:

SELECT blalbalbla
FROM Tabla1
UNION
SELECT blablabla
FROM Tabla2

Eso por ejemplo en una vista.

Y ya trabajas con la vista, pero si quieres hacer algo de verdad bien ponlo todo en una tabla porque eso es una cagada enorme.

1 respuesta
ArcheR

#23, ya he dicho antes que trabajaba con todo en una sola tabla, y que simplemente tomé esa decisión de dividirlo por lo que me había comentado el colega (bueno, hasta ahora lo consideraba colega ¬¬), por lo que no hace falta que te me tires a la yugular, hombre xD

1 respuesta
HoTiTo

#24 Yo que tú me cagaba en la boca del colega, pero así en plan diarrea líquida post-buffetchino.

ArcheR

Créeme que lo haré en cuanto lo vea, porque encima es un tema que ya llevo dándole vueltas desde hace tiempo pensando que lo que me decía era verdad para ahora ver que no xD

elkaoD

Os habéis ido todos por las ramas del JOIN cuando lo que quiere #1 es un UNION.

Dicho esto, tu estructura de tablas es la merde.

1 respuesta
Soltrac

#27 No todos, no todos, q ya se lo dije en #23 xDD

Usuarios habituales

  • Soltrac
  • elkaoD
  • ArcheR
  • HoTiTo
  • Khanser
  • Yandr0s