UTNianos

Versión completa: [APORTE] FINAL GDD 21/12/2020
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Modalidad Virtual

40 min por el campus

1- Si una columna posee la constraint UNIQUE, entonces un sola fila como máximo puedecontener NULL en dicha columna. (V/F)
2- En SQL, una subconsulta en el SELECT siempre debe retornar una fila y una columna. (V/F)
3- IMAGEN(transacción)
Las transacciones A y B son ejecutadas ambas con un nivel de aislamiento SERIALIZABLE. Responder cual es la respuesta correcta.
Seleccione una:
a. Se genera un interbloqueo
b. La transacción B queda desestimada porque aplica un rollback al final, dejando
que la transacción A realice la modificación.
c. Ninguna de las anteriores
d. Se modifica solamente el producto cuyo id = 1, con un valor X en el atributo
detalle

4- IMAGEN(ojeto)



Y si aprobabas la parte del campus pasabas al oral 2 o 3 preguntas
- Huffman
- Arbol-B
- Trigger
Hola!

Gracias por esto! vale oro. Sólo una consulta para quien tenga alguna idea: el punto 4 del DER, apela a que lo pensemos con triggers ¿no?
(23-12-2020 09:56)emilianoG escribió: [ -> ]Hola!

Gracias por esto! vale oro. Sólo una consulta para quien tenga alguna idea: el punto 4 del DER, apela a que lo pensemos con triggers ¿no?

Digamos que si, apelando al control de la integridad sobre el campo id de especialidad cuando se insertan registros o si se actualiza ese campo, chequeando ese nuevo campo exista en la tabla de Especialidades.
Para no hacer un tema aparte, les subo imagenes de otro tema del final. No llegue a la parte oral.
(23-12-2020 09:56)emilianoG escribió: [ -> ]Hola!

Gracias por esto! vale oro. Sólo una consulta para quien tenga alguna idea: el punto 4 del DER, apela a que lo pensemos con triggers ¿no?

Claro, yo hice un trigger en el que te tenés que fijar, si insertas un entrenador, que exista ese id, eliminas una especialidad que no se esté usando ese id en entenador, y el update también.
No llegué a completar bien la lógica, por eso no subí resolución.
Holis

Dejo mi resolución de este final: el tema de Mica completo y la parte práctica del tema de driped. Creo haber llegado bien a lo que pedían pero cualquier cosa me avisan

Besis love
(22-06-2021 18:25)nicolasAM escribió: [ -> ]Holis

Dejo mi resolución de este final: el tema de Mica completo y la parte práctica del tema de driped. Creo haber llegado bien a lo que pedían pero cualquier cosa me avisan

Besis love

Hola nicolasAM

Tengo unas diferencias con respecto a los ejercicios 2 y 3,
2 - En las clases de Reinosa justamente lo comenta y lo comenta como VERDADERO. Siempre debe devolver un escalar es decir un valor(conformado por una fila y una columna)
En SQL, una subconsulta en el SELECT siempre debe retornar una fila y una columna. (V/F).

3 - Vi en otros finales que toman como verdadera esta opción:
"d. Se modifica solamente el producto cuyo id = 1, con un valor X en el atributo detalle "
Entiendo que la Transacción A bloquea primero la tabla, por eso actualiza el detalle con un X donde el id=1 y luego del commit, la transacción B va a modificar pero en el UPDATE no especifica qué fila, porque no detalla el id(aunque al final haya un rollback, no se indicó para qué registro sería el update). Por eso, sólo se modifica lo que se realiza con la transacción A.

Espero los comentarios de quienes lean esto y si difieren en algo, me lo hagan saber.

Gracias!!
Holis

Me agarraste un poco en offside ya con esta materia porque no la tengo tan clara como hace un tiempo, pero me puse a ver un poco sobre lo que decís.

* 2- En SQL, una subconsulta en el SELECT siempre debe retornar una fila y una columna. (V/F)

Mi respuesta: "FALSO. (Puede contener varias filas)"

Te muestro un contraejemplo: Ejercicio 10 de la guía

/*
EJERCICIO N°10

Mostrar los 10 productos mas vendidos en la historia y también los 10 productos
menos vendidos en la historia. Además mostrar de esos productos, quien fue el
cliente que mayor compra realizo.
*/

SELECT
prod_codigo AS 'Codigo',
prod_detalle AS 'Producto',
(SELECT TOP 1 fact_cliente
FROM Item_Factura
JOIN Factura ON item_numero + item_tipo + item_sucursal =
fact_numero + fact_tipo + fact_sucursal
WHERE item_producto = prod_codigo
GROUP BY fact_cliente
ORDER BY SUM(item_cantidad) DESC) AS 'Mejor cliente'
FROM Producto
WHERE prod_codigo IN
(SELECT TOP 10 item_producto
FROM Item_Factura
GROUP BY item_producto
ORDER BY SUM(item_cantidad) DESC)
OR prod_codigo IN
(SELECT TOP 10 item_producto
FROM Item_Factura
GROUP BY item_producto
ORDER BY SUM(item_cantidad) ASC)

A menos que, claro, no se considere subconsulta a una que exista en el WHERE; cosa que no recuerdo.

3- IMAGEN(transacción)
Las transacciones A y B son ejecutadas ambas con un nivel de aislamiento SERIALIZABLE. Responder cual es la respuesta correcta.
Seleccione una:
a. Se genera un interbloqueo
b. La transacción B queda desestimada porque aplica un rollback al final, dejando
que la transacción A realice la modificación.
c. Ninguna de las anteriores
d. Se modifica solamente el producto cuyo id = 1, con un valor X en el atributo
detalle


Mi respuesta: c. Justificación: "Al ser serializable, se realiza cada transacción por separado. Pero como ambas comienzan en el t=0 no se sabe cuál va primero y por ende cuál ejecuta"
Vos decís:
Cita:Entiendo que la Transacción A bloquea primero la tabla, por eso actualiza el detalle con un X donde el id=1 y luego del commit, la transacción B va a modificar pero en el UPDATE no especifica qué fila, porque no detalla el id(aunque al final haya un rollback, no se indicó para qué registro sería el update). Por eso, sólo se modifica lo que se realiza con la transacción A.

Debo insistir con mi propia justificación: ¿Por qué suponés que la transacción A bloquea primero la tabla? Lo único que te indica cuáles son los tiempos de ejecución son los instantes de la primera columna de la tabla en la imagen. Ambas arrancan en el instante t=0, por ende no podés asegurar absolutamente nada del orden de ejecución ni cómo van a quedar las tablas al finalizar la corrida. ¿Podría suceder lo que decís? Obviamente. ¿Podría suceder otra cosa? También.

Cualquier cosa me decís. Besis love
Gracias por la respuesta!!!

2 - Esto lo saqué literal de las PPT de clases:

SUBCONSULTA EN EL SELECT: siempre debe devolver un escalar o sea un conjunto conformado por una fila y una columna

SELECT col1, (SELECT col5 FROM tabla2 WHERE col3 = tablas1.col1) FROM tabla1

Dado que el SELECT en la lista de columnas está esperando un valor, si el resultado del SUBSELECT devuelve más de un valor ya sea en fila o en columna arroja error.



SUBCONSULTA EN EL WHERE: puede devolver cualquier expresión que pueda ser utilizada en una condición

SELECT col1, col2 FROM tabla1
WHERE col1 = (SELECT col3 FROM tabla2 WHERE col3 = tablas1.col1)

SELECT col1, col2 FROM tabla1
WHERE col1 IN (SELECT col3 FROM tabla2)

SELECT col1, col2 FROM tabla1
WHERE EXISTS (SELECT col3 FROM tabla2 WHERE col1 = col3)


El ejemplo que vos copias del ejercicio 10, tiene una subconsulta en el SELECT (TOP 1-va a devolver 1 valor) y en la subconsulta en el WHERE va a devolver varias filas por el TOP 10.


3- También muestra un ejercicio en clases, explicando esto.
El SELECT que se ejecuta primero es el que bloquea la tabla(en este caso primero ocurre el de la transacción A). "El primero que toca la tabla, la bloquea. El BEGIN TRANSACTION no bloquea, porque no está queriendo acceder a los datos"
No es exactamente el mismo ejercicio, pero es donde lo explica(1:36:40 aprox)
https://drive.google.com/file/d/1LKqXVlm...zgHT-/view

Lo que vos decís, creo aplica para cuando el SELECT se realiza en el mismo instante. (que sería el ejercicio del tema que le tomaron a driped)
Entonces, yo al menos diría, que en el caso del 2 la afirmación sigue siendo falsa. Sin embargo, está muy copada la ampliación de tu respuesta, queda mucho más claro.

En el caso del 3, ese dato no lo tenía. Buen aporte también. Andá a saber igual si hasta algunos de los profesores saben eso; que marcan "Ninguna de las anteriores" como LA respuesta válida. De todas formas, si vas a rendir en esta fecha y te aparece ese ejercicio, no dudaría en poner la que acá marcan como válida. No creo que se hayan puesto a pensar en esa posibilidad lol

Besis y éxitos love
Gracias por el debate, sirve para pensar en las respuestas más haya de los resultados que den en los exámenes! =D

P/D: Ojalá me tomen esas 2 jajajaja

Besis wave
Las subconsultas pueden tener cualquier cantidad de filas y columnas.

Podrías hacer una subquery que te devuelva datos tabulados, otra subquery que te devuelva otros datos tabulados y después joinearlos como si fueran dos tablas si no me equivoco, por ejemplo.

EDIT: no había leído que hablaba de una subquery dentro del select, donde si o si tiene que ser un sólo valor.
Hola Renkon, depende de dónde invoques la subconsulta debe cumplir con algunos requisitos.

En este caso en particular la pregunta hace referencia a subconsultas en el SELECT, en otras líneas aplican otras restricciones/condiciones para que no arroje error.

No es lo mismo en el SELECT/GROUP BY/ORDER BY - donde la restricción es la misma: devuelve 1 fila y 1 columna (1 valor)

Que en el WHERE - donde la restricción depende de cómo querramos filtrar
SUBCONSULTA EN EL WHERE: puede devolver cualquier expresión que pueda ser utilizada en una condición

SELECT col1, col2 FROM tabla1
WHERE col1 = (SELECT col3 FROM tabla2 WHERE col3 = tablas1.col1)

SELECT col1, col2 FROM tabla1
WHERE col1 IN (SELECT col3 FROM tabla2)

SELECT col1, col2 FROM tabla1
WHERE EXISTS (SELECT col3 FROM tabla2 WHERE col1 = col3)
(22-09-2021 12:26)daia0325 escribió: [ -> ]Hola Renkon, depende de dónde invoques la subconsulta debe cumplir con algunos requisitos.

En este caso en particular la pregunta hace referencia a subconsultas en el SELECT, en otras líneas aplican otras restricciones/condiciones para que no arroje error.

No es lo mismo en el SELECT/GROUP BY/ORDER BY - donde la restricción es la misma: devuelve 1 fila y 1 columna (1 valor)

Que en el WHERE - donde la restricción depende de cómo querramos filtrar
SUBCONSULTA EN EL WHERE: puede devolver cualquier expresión que pueda ser utilizada en una condición

SELECT col1, col2 FROM tabla1
WHERE col1 = (SELECT col3 FROM tabla2 WHERE col3 = tablas1.col1)

SELECT col1, col2 FROM tabla1
WHERE col1 IN (SELECT col3 FROM tabla2)

SELECT col1, col2 FROM tabla1
WHERE EXISTS (SELECT col3 FROM tabla2 WHERE col1 = col3)

Tenés razón. No había visto que mencionaba el SELECT exclusivamente. Ahí si entonces tiene que ser un sólo valor.
URLs de referencia