Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

INSERT con seleccion de 2 datos no me funca!

Estas en el tema de INSERT con seleccion de 2 datos no me funca! en el foro de Mysql en Foros del Web. Hola, aprovechando la buena disposicion de la gente del foro quisiera preguntar que esta mal en mi consulta que no me resulta: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código ...
  #1 (permalink)  
Antiguo 11/02/2010, 16:37
 
Fecha de Ingreso: julio-2009
Mensajes: 90
Antigüedad: 15 años, 3 meses
Puntos: 4
Pregunta INSERT con seleccion de 2 datos no me funca!

Hola, aprovechando la buena disposicion de la gente del foro quisiera preguntar que esta mal en mi consulta que no me resulta:

Código MySQL:
Ver original
  1. INSERT INTO temporal_cambioentrantes (codigo,posicion,prof,id_inventario)
  2. VALUES (0,1,(
  3. SELECT st.profundidad AS prof,st.id_interno as id_inventario
  4. FROM  (stock_bodegas  st INNER JOIN tipos_neumaticos tn ON tn.id_interno)
  5. WHERE st.medida=9
  6. ))


cuando ejecuto esta parte sale bien:

Código MySQL:
Ver original
  1. SELECT st.profundidad AS prof,st.id_interno as id_inventario
  2. FROM  (stock_bodegas  st INNER JOIN tipos_neumaticos tn ON tn.id_interno)
  3. WHERE st.medida=9

incluso cuando omito el:

st.profundidad AS prof

y su correspondiente campo en el insert se inserta bien, pero necesito insertar la profundidad y me arroja el sgte error:

1136 - Column count doesn't match value at row 1

o sea estoy clarito que me dice que no me calzan el numero de datos que quiero ingresar con las columnas:

ahora bien, mientras escribia esto me di cuenta que podia hacerlo de la sgte manera:

Código MySQL:
Ver original
  1. INSERT INTO temporal_cambioentrantes (codigo,posicion,profundidad,id_inventario)
  2. VALUES (0,1,(
  3. SELECT st.profundidad AS profundidad
  4. FROM  (stock_bodegas  st INNER JOIN tipos_neumaticos tn ON tn.id_interno)
  5. WHERE st.medida=9
  6. ),(
  7. SELECT st.id_interno as id_inventario
  8. FROM  (stock_bodegas  st INNER JOIN tipos_neumaticos tn ON tn.id_interno)
  9. WHERE st.medida=9
  10. ))

¿pero me pregunto si no habrá otra manera mas eficiente de hacer la consulta?
  #2 (permalink)  
Antiguo 11/02/2010, 17:28
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: INSERT con seleccion de 2 datos no me funca!

Yo te advertí que era ineficiente...: multiples filas/ mismos datos/ un solo INSERT

Código MySQL:
Ver original
  1. INSERT INTO temporal_cambioentrantes(codigo, posicion, profundidad, id_inventario)
  2. SELECT 0, 1, ST.profundidad, ST.id_inventario
  3. FROM stock_bodegas  ST INNER JOIN tipos_neumaticos TN USING(id_interno)
  4. WHERE st.medida=9
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 11/02/2010, 21:03
 
Fecha de Ingreso: julio-2009
Mensajes: 90
Antigüedad: 15 años, 3 meses
Puntos: 4
Respuesta: INSERT con seleccion de 2 datos no me funca!

pero si es otra consulta y que surgio precisamente por hacerte caso, jaja. esto es de cuando hago un cambio de neumatico a un bus usando un neumatico nuevo que saco del stock donde no estan individualizados para que se conviertan en entes individualizables (el que los individualice buen individualizador será).

gracias por la respuesta
  #4 (permalink)  
Antiguo 11/02/2010, 21:42
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: INSERT con seleccion de 2 datos no me funca!

El tema es que el concepto es el mirmo, por eso lo decía.
Si vas a hacer un volcado de datos desde una tabla o un JOIN de tablas a otra, no te conviene tomar los valores individuales como subconsultas en el SELECT, porque eso hace que esa/s subconsulta/s se hagan una vez por cada campo en cada registro que se lea... y el hecho de que pueda haber más de un resultado en ese JOIN significa que lo hará primero con todos los registros, para recién entonces tomar el primero.
Por eso se considera poco eficiente.
A eso debes sumarle que si el WHERE campo = valor se hace sobre un campo que no es PK o no tiene índice definido sobre él, la consulta deberá leer al menos la mitad de la tabla (estimativamente hablando) antes de encontrar el valor buscado, y hará en toda esa tabla las subconsultas, una por vez....

O sea, si puedes hacer un INSERT ... SELECT sin meterle subconsultas en el SELECT, mejor.

Detalle: Si las subconsultas son parte del FROM o el WHERE, no tienen tanto impacto y son optimizables. Las que les pongas como campos del SELECT, no.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 12/02/2010, 07:44
 
Fecha de Ingreso: julio-2009
Mensajes: 90
Antigüedad: 15 años, 3 meses
Puntos: 4
Respuesta: INSERT con seleccion de 2 datos no me funca!

voy a analizar tus sugerencias, muy bienvenidas en todo caso, soy muy novato en esto de las BD y por alguna razon (obviamente ignorancia por mi parte) no he podido crear FK's para los tipos_neumaticos, de ahi la razon de usar los JOIN, las bases las he hecho desde Navicat y me arroja un error "Can't create table 'xxx' (errno: 150)". He googleado un poco pero no logro encontrar el porque, debe ser algun error mio, definitivamente
  #6 (permalink)  
Antiguo 12/02/2010, 08:18
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: INSERT con seleccion de 2 datos no me funca!

Cita:
) no he podido crear FK's para los tipos_neumaticos, de ahi la razon de usar los JOIN, las bases las he hecho desde Navicat y me arroja un error "Can't create table 'xxx' (errno: 150)".
Si tienes datos ya cargados, es posible que se esté produciendo una inconsistencia al intentar crear la contraint. Eso suele suceder cuando algún valor ya existente no cumple con la FK.
Otra posibilidad es que los campos que se intenta relacionar no sean exactamente iguales. Esto significa que, por ejemplo un campo INT UNSIGNED no puede usarse para una FK de un campo INT SIGNED, porque los rangos de representación son distintos; en el caso de un VARCHAR, por ejemplo, tienen que tener el mismo ancho, y del mismo CHARSET. Si intentas crear una FK entre un latin1 y un utf8, no podrás.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: insert, seleccion
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:06.