Sv Community El Salvador
Soporte y Tecnología => Programación => Base de Datos => Mensaje iniciado por: kikeuntercio en mayo 03, 2007, 01:10:45 am
-
tengo una tarea a la cual no le capto mucho ya que nose mucho de base de datos relacionales
bueno lo que me piden es lo siguientedice asi:
C.- Borrar el Mazda de "Martin Gomez"
Los datos de la base es la siguiente:
Conductor(numero_carnet,nombre,direccion)
Coche(matricula,modelo,año)
Accidente(numero_parte,fecha,lugar)
posee(numero_carnet,matricula)
Participo(numero_carnet,coche,numero_parte,importe_daños)
espero me ayuden con esto ya que como digo en esto de SQL no mucho
-
q es MS SQL Server ??? MySQL ??? u otro ???
mas o menos te capto proba algo asi como lo siguiente
DELETE FROM nombredetabla WHERE conductor='Martin Gomez' AND modelo='mazda'
-
cabal asi como dice mauro es..
DELETE FROM tabla_name WHERE conductor='Martin Gomez'
-
cabal asi como dice mauro es..
DELETE FROM tabla_name WHERE conductor='Martin Gomez'
pero eso solo me elimiaria el dato de una sola tabla, en este caso el de la tabla conductor.
q es MS SQL Server ??? MySQL ??? u otro ???
mas o menos te capto proba algo asi como lo siguiente
DELETE FROM nombredetabla WHERE conductor='Martin Gomez' AND modelo='mazda'
es en SQL Server
y tu respuesta no podria ser ya que no existe una tabla que contenga "conductor" y "modelo"(aunque en mi caso creo que seria "coche" en la tabla "participo") al mismo tiempo
lo que yo creo es que tendria que hacer un eliminar pero en base a DOS consultas previas pero eso es exactamente lo que no puedo hacer :-/ o nose si me equivoco
-
Sacos!!!
Pense q conductor porq decia "...el carro de Martin Gomez" (osea el nombre de la persona) XD
Es q no te especificaste bien viejo
Bueno pero por hay va la idea :coffee: me voy a descansar un poco :lazy:
estoy frikiado ahorita :shock:
-
Seria algo así:
DELETE FROM coche
WHERE coche.matricula IN (SELECT posee.matricula FROM posee INNER JOIN conductor ON posee.numero_carnet = conductor.numero_carnet WHERE conductor.nombre='Martin Gomez') AND coche.modelo = 'Mazda'
-
yo la verda' no entiendo muy bien tu pregunta, y no la entiendo porque las soluciones que te han dado te deberian de funcionar....
con lo de bases relacionales, me imagino que tu problema es que la informacion esta amarrada en todas las tablas, por lo que debes de eliminar primero la informacion en la tabla hija y luego para arriba.
viendo las tablas que has puesto
Conductor(numero_carnet,nombre,direccion)
Coche(matricula,modelo,año)
Accidente(numero_parte,fecha,lugar)
posee(numero_carnet,matricula)
Participo(numero_carnet,coche,numero_parte,importe_daños)
dejando de lado que la base de datos esta algo pateadita(se que es por tratarse de un deber, pero tenia que decirlo), debes de averiguarte como estan creadas las relaciones entre las tablas, y asi detectaras quien es primary key table y quien es foreign pa empezar a eliminar las tablas que son foreign.... esto en el enterprise manager
sino pues, haciendo uso de las ayuditas que da sql2000 empeza a eliminar la info en cualquier tabla, sql te dira que
DELETE statement conflicted with TABLE REFERENCE constraint 'constraint1'. The conflict occurred in database 'Conductores_Chocos', table 'conductor'.
The statement has been terminated.
lo anterior como resultado del script
delete from conductor where nombre ='Martin Gomez'
claro!!!, se que esto ultimo es un metodo a prueba y error .......pero ¿?¿?¿?
-
Hey frank pero con ese delete borrarias el mazda de el listado de coches pero siempre quedaria como que si el chero posee el carro o no ??, lo borra automaticamente de las 2 ?
-
Hey frank pero con ese delete borrarias el mazda de el listado de coches pero siempre quedaria como que si el chero posee el carro o no ??, lo borra automaticamente de las 2 ?
Depende de como se hagan las relaciones, si se define como un "on delete cascade" (borrado en cascada) de un sólo se va también la tupla de la pertenencia.
En este caso si no se define así, no te lo borrará :D porque te dará un warning de integridad referencial.
Yo sólo hice la sentencia que pedía el amigo kike, asumiendo que sí hay un borrado en cascada.
-
Depende de como se hagan las relaciones, si se define como un "on delete cascade" (borrado en cascada) de un sólo se va también la tupla de la pertenencia.
En este caso si no se define así, no te lo borrará :D porque te dará un warning de integridad referencial.
Yo sólo hice la sentencia que pedía el amigo kike, asumiendo que sí hay un borrado en cascada.
Si me imagine que habias tomado en cuenta lo de borrado en cascada, supongo que si queres borrar los 2 manualmente lo haces con un subquery
-
hey frank mira estaba intentando modificando el codigo que vos distes per aun asi no le allo mucho :-/
quiero solo dejar algo en claro para ver si asi me ayudan mejor.
en la ultima parte del codigo de frank el pone esto:
"AND coche.modelo = 'Mazda'" pero no creo que seria asi, ya que en coche.modelo nosotros hemos puesto por ejemplo "3" y en participo.coche hemos puesto "Mazda" osea que en otras palabras seria:
Marca = participo.coche
Modelo = coche.modelo
bueno aclaro que desde un principio no le encontre mucho sentido a esta base de datos asi como dice tekun y eso que escribi es lo que exactamente pide el ejercicio, ahora el borrado en cascada si esta activado, pero por el momento he probado modificando el codigo que proporciono frank pero no me borra nada :cry:
-
y eliminando en tabla por tabla no te funciona....
-
hey frank mira estaba intentando modificando el codigo que vos distes per aun asi no le allo mucho :-/
quiero solo dejar algo en claro para ver si asi me ayudan mejor.
en la ultima parte del codigo de frank el pone esto:
"AND coche.modelo = 'Mazda'" pero no creo que seria asi, ya que en coche.modelo nosotros hemos puesto por ejemplo "3" y en participo.coche hemos puesto "Mazda" osea que en otras palabras seria:
Marca = participo.coche
Modelo = coche.modelo
bueno aclaro que desde un principio no le encontre mucho sentido a esta base de datos asi como dice tekun y eso que escribi es lo que exactamente pide el ejercicio, ahora el borrado en cascada si esta activado, pero por el momento he probado modificando el codigo que proporciono frank pero no me borra nada :cry:
Yo siento que te has complicado, hasta donde yo veo la sentencia que yo te puse estaría buena.
Según entiendo la tabla "participo" es cuando el coche ha chocado, pero ahí sólo te dicen que borrés el mazda de Martín Gomez, nada más.
Por qué no ponés la sentencia tal y como la has probado para ver si hay algún error ahí?
-
Frank con el codigo que me distes exactamente no me funciona como te digo en coche.modelo almacenasmos por ejemplo: de un "toyota 1600" alli almacenamos "1600" y en participo.coche almacenamos la marca osea "toyota"
pero poniendo "AND coche.modelo = '3'" asumiendo que el "3" es el modelo del Mazda entonces si me elimina de la tabla coche.
y yo probe modifiando el "AND participo.coche = 'Mazda'" pero me da un error que dice:
"el prefijo de la columna 'participo' no coincide con un nombre de tabla o con un alias usando en la consulta"
ahora con lo que dice ~ no he probado aun primero ire a cenar y luego vere si pruebo el codigo que dejastes.
de antemano les dire que todos aca ya se ganaron su respectivo +K
-
pero poniendo "AND coche.modelo = '3'" asumiendo que el "3" es el modelo del Mazda entonces si me elimina de la tabla coche.
y yo probe modifiando el "AND participo.coche = 'Mazda'" pero me da un error que dice:
"el prefijo de la columna 'participo' no coincide con un nombre de tabla o con un alias usando en la consulta"
si esa modificacion la hiciste en el script que te puso frank, tal cual, no te funciona porque no has puesto la tabla 'participo' en el query principal....
pone como te dijo frank el script que ejecutas pa' estar hablando el mismo idioma
-
fijence que hemos estado reflexionando aca con los compañeros y llegamos a la conclusion que lo que se pide esta mal ya que como dijo "~" dara error en el caso que se repitan los carros del mismo dueño asi que pensamos dejarlo asi:
DELETE FROM coche
WHERE coche.matricula IN (SELECT posee.matricula FROM posee INNER JOIN conductor ON posee.numero_carnet = conductor.numero_carnet WHERE conductor.nombre='Martin Gomez') AND coche.matricula = 'numero_matricula'
Gracias a todos por su colaboracion y alli les deje su respectivo +K
-
esta facil, tenes que relacionar las tablas de esta manera:
C.- Borrar el Mazda de "Martin Gomez"
Los datos de la base es la siguiente:
Conductor(numero_carnet,nombre,direccion) *
Coche(matricula,modelo,año)
Accidente(numero_parte,fecha,lugar)
posee(numero_carnet,matricula) *
Participo(numero_carnet,coche,numero_parte,importe_daños)
CADA conjunto es una tabla, y su interior son los campos que existen en dicha tabla
asi que tenes que relacionar la tabla conductores con coche
COMO SOLO ES UN REGISTRO:
delete from
conductor as con,
posee as pos,
coche as coc,
participo as par
where
con.nombre = "Martin Gomez"
and par.coche = "Mazda"
and con.numero_carnet = pos.numero_carnet
and coc.matricula = pos.matricula
and par.numero_carnet = con.numero_carnet
and par.numero_carnet = pos.numero_carnet
-
borth probe con tu codigo pero al parecer no se puede hacer eso en el SQL server pero como dije antes lo dejaremos de la forma especificada en mi post anterior ya que creemos es lo mas cercano a lo correcto.
Gracias a todos por su colaboracion y esten pendientes que seguro tendre mas dudas ya que vi que los otros ejercicios estan medio yucas tambien :-/
asi que espero me puedan hechar la manito tambien XD
-
borth probe con tu codigo pero al parecer no se puede hacer eso en el SQL server
claro que se puede mi amigo :)
y muchas mas. lo que yo considero es que tu base de datos ta algo rara!!!, pero en fin.
-
claro que se puede mi amigo :)
y muchas mas. lo que yo considero es que tu base de datos ta algo rara!!!, pero en fin.
yo tambien sigo diciendo que la base esta rara pero ni modo asi esta en el folleto :-/
pero con lo del codigo de borth me da error:
(http://img176.imageshack.us/img176/9358/printttcp2.jpg)
-
tenes toda la razon.... no habia leido el script bien jajajaja
lo que pasa es que cuando ocupas el alias en las bases y vas a eliminar, lo que tenes que hacer es poner el alias luego de delete from
delete a
from coche
where exists(
select * from posee
where a.matricula=matricula
and modelo='Mazda')
aunque no luego comprender que tablas tienen mas info de lo que queres eliminar
-
bueno aca les traigo otro que por mas que intente no le capto tambien...
datos de la base:
empleado(nombre_empleado,calle,ciudad)
trabaja(nombre_empleado,nombre_empresa,sueldo)
empresa(nombre_empresa,ciudad)
jefe(nombre_empleado,nombre_jefe)
g.) Determine las empresas cuyos empleados ganan un sueldo mas alto en media que el sueldo medio del "banco importante".
-
Para esa última se me ocurre algo como lo siguiente:
SELECT empresa.nombre_empresa
FROM empresa INNER JOIN trabaja ON
empresa.nombre_empresa = trabaja.nombre_empresa
WHERE
AVG(trabaja.sueldo) > (SELECT AVG(trabaja_1.sueldo)
FROM trabaja trabaja_1
WHERE trabaja_1.nombre_empresa='banco importante')
GROUP BY empresa.nombre_empresa
Si no te funciona avisame porque ahorita las estoy haciendo sin probarlas y es muy pero muy probable que te fallen :rofl:
-
para la pregunta g te debe funcionar lo que dice frank
con la otra pregunta la f (la empresa que tiene mayor # empleados)
select nombre_empresa empresa, count(*) n_empleados
from trabaja
group by nombre_empresa
con ese script va a salir algo como esto:
empresa n_empleados
lips 5
evolution 4
gatitas 20
es facil saber que empresa tiene mas.....
-
tekun asi lo hice el f y me rurulo bien claro lo ordene de mayor a menor para que se viera mejor =D
pero con lo del literal g.) alli si que no me furula por el momento :-/ me da error el codigo de frank
-
tekun asi lo hice el f y me rurulo bien claro lo ordene de mayor a menor para que se viera mejor =D
pero con lo del literal g.) alli si que no me furula por el momento :-/ me da error el codigo de frank
Como te dije, lo mas probable es que te fallara, pero nos ayudarías a ayudarte si nos ponés el mensaje de error que te lanza.
-
ese es el errror que tira:
Servidor: mensaje 147, nivel 15, estado 1, línea 5
No puede aparecer un agregado en la cláusula WHERE si no es en una subconsulta contenida en una cláusula HAVING o en una lista de selección, y siempre que la columna agregada sea una referencia externa.
Servidor: mensaje 156, nivel 15, estado 1, línea 8
Sintaxis incorrecta cerca de la palabra clave 'GROUP'.
-
al parecer no permite sql los subquerys con medias, por que.... nose,
Pero como "a falta de Pan buenas son galletas" mira si te sirve esto
drop table tmp -- esto pa' estar seguro que la tabla no existe
-- crea una temporal de las empresas con su media de sueldos
select nombre_empresa
,avg(sueldo) media
into tmp
from trabaja
group by nombre_empresa
-- lista la empresa que su media sea mayor que la media del banco mas importante
select nombre_empresa from tmp
where media>(select avg(sueldo) from trabaja
where nombre_empresa='banco importante)
group by nombre_empresa
-
lo probare de camino a la U vemox mara que me toca entrar a las 11:00
gracias tekun
-
Si no te funciona en el where ponelo en el having así:
SELECT empresa.nombre_empresa
FROM empresa INNER JOIN trabaja ON
empresa.nombre_empresa = trabaja.nombre_empresa
GROUP BY empresa.nombre_empresa
HAVING AVG(trabaja.sueldo) > (SELECT AVG(trabaja_1.sueldo)
FROM trabaja trabaja_1
WHERE trabaja_1.nombre_empresa='banco importante')