Operadores de conjunto en SQL-Server: UNION, INTERSECT y EXCEPT

Los operadores de conjunto UNION, INTERSECT y EXCEPT nos permite combinar en una misma salida el resultado de distintas consultas SELECT, construyendo así una consulta más compleja, lo que se llama una consulta compuesta. Para poder combinar dos consultas con estos operadores necesitamos que se cumplan dos requisitos:

  • Que ambas consultas devuelvan el mismo número de columnas.
  • Que estas columnas contengan el mismo tipo de datos, o al menos tipos de datos que se puedan convertir de forma implícita.

Estos tres operadores se incorporaron a SQL-Server a partir de la versión 2008 y están también disponibles en la base de datos SQL de la plataforma Azure. Los tres operadores aceptan además el parámetro ALL, que modificará ligeramente los resultados ¿Cómo funcionan y qué diferencia hay entre ellas?

EXCEPT:

Este operador encuentra la diferencia entre las dos consultas y devuelve las filas que pertenecen únicamente a la primera consulta. Es decir, si una tupa aparece tanto en la consulta de la izquierda como en la de la derecha no será incluida en el resultado final. Si aparece solo en la de izquierda y en la de la derecha no, entonces será devuelta una vez.

Si añadimos ALL al EXCEPT notaremos una pequeña diferencia. Al igual que con el EXCEPT a secas el operador buscará la diferencia entre las dos consultas, pero los datos devueltos cambian. En este caso si una tupla aparece un número m de veces en la primera consulta, y la misma tupla aparece un número n veces en la segunda consulta, entonces esa tupla aparece m – n veces en la respuesta de salida, si dicha resta es mayor que 0.

/*consultamos una tabla de Productos 
y sacamos todos los resultados únicos 
que no que existen en la consulta sobre la tabla Almacén*/

Select Descripcion, Codigo from Productos
EXCEPT
Select Descripcion, Codigo from Almacen

/*Con ALL si la tupa Descripción,Codigo existiese tres veces
en el resultado de la primera consulta y una vez en la segunda
entonces en el resultado final saldría dos veces*/
Select Descripcion, Codigo from Productos
EXCEPT ALL
Select Descripcion, Codigo from Almacen

INTERSECT:

Este operador combina los resultados de dos consultas en un único resultado que comprime todas las filas comunes para ambas consultas. Es decir, funcionaría como un AND lógico: devuelve solo las ocurrencias existentes en ambas consultas.

Si añadimos ALL a este operador el resultado también cambiará. En ese caso si una tupla aparece un número m de veces en el resultado de la primera consulta y la misma tupla aparece n veces en la segunda, entonces esa tupla aparece el menor número de entre m o n en la respuesta de salida.

/*consultamos una tabla de Productos 
y sacamos todos los resultados únicos 
que también existen en la consulta sobre la tabla Almacén*/

Select Descripcion, Codigo from Productos
INTERSECT
Select Descripcion, Codigo from Almacen

/*Con ALL si la tupa Descripción,Codigo existiese tres veces
en el resultado de la primera consulta y una vez en la segunda
entonces en el resultado final saldría una vez solo*/
Select Descripcion, Codigo from Productos
INTERSECT ALL
Select Descripcion, Codigo from Almacen

UNION:

Finalmente vamos con UNION. Si antes os decía que INTERSECT funciona como un operador lógico AND entonces UNION funcionaría como un operador lógico OR. Devuelve las filas únicas que existen o en la consulta de la izquierda o en la de la derecha.

En este caso el operador ALL lo que hará será modificar el resultado del UNION de forma que en lugar de recibir solo las filas únicas recibamos tantas filas como haya en la primera consulta y en la segunda, un poco la operación contraria a la que realiza EXCEPT ALL. En este caso si una tupla aparece un número m de veces en la primera consulta, y la misma tupla aparece un número n veces en la segunda consulta, entonces esa tupla aparece m + n veces en la respuesta de salida.

/*consultamos una tabla de Productos 
y la tabla Almacén y sacamos los resultados únicos, distintos*/

Select Descripcion, Codigo from Productos
UNION
Select Descripcion, Codigo from Almacen

/*Con ALL si la tupa Descripción,Codigo existiese tres veces
en el resultado de la primera consulta y una vez en la segunda
entonces en el resultado final saldría cuatro veces*/
Select Descripcion, Codigo from Productos
UNION ALL
Select Descripcion, Codigo from Almacen

Anuncios

Musiqueando 5 (20190523)

La semana pasada recordábamos que llevamos 9 años sin Dio y me entró la vena melancólica. Porque la voz de Ronnie James ha significado mucho para mi durante años, no solo por las horas dándole vueltas a las cintas de Heaven and Hell y Long Live Rock and Roll en el walkman cuando estaba en el instituto, ni por los recuerdos de compartir cervezas con muy buenos amigos en las tres veces que tuve suerte de verle en directo. No, aunque haya tenido un romance con su voz durante más de 20 años, desde que un amigo me grabara en Long Live Rock and Roll de Rainbow, no son los buenos recuerdos los que hacen mi relación con su música tan especial sino los malos: hubo una época en la que tenía una situación laboral horrible, en una empresa/chiringuito en la que trabajaba sin contrato porque el empresaurio decía “estamos pendientes de una subvención de la Xunta para este proyecto, pero hay que ir empezando, cuando llegue la pasta lo formalizamos”, donde las jornadas se estiraban hasta las 12 o 13 horas, llegando una vez a tirarme consecutivas 36 horas en dicha oficina sin dormir, donde no sabía si cobraría o cuánto cobraría a fin de mes (en cuatro meses currando allí cobré de menos en tres)… en fin, una puta mierda con la que tragas porque necesitas dinero sí o sí hasta que de puro agotamiento mandas todo a la mierda. Bueno, pues en esa época me subía al bus todos los días, me enchufaba los auriculares de mi mp3 y ponía The Last In Line, siempre The Last In Line, el disco entero. ¿Por qué? Porque extrañamente me daba energías para afrontar la incierta jornada. Así que no voy a hablar de su influencia en los inicios del heavy metal, de su importancia en la historia del rock o de su rango vocal: para mi Dio es tan grande simplemente porque escucharle me hacía sentirme mejor cuando estaba jodido.

Mi descubrimiento musical excitante de los últimos días son The Main Squeeze, un grupo estadounidense (Bloomfield, Indiana) de funk que no hace ascos al rock clásico ni al soul y que, nueve años después de su formación, ya cuentan con tres discos de estudio, dos directos y un puñado de sesiones en su canal de Youtube donde hacen diversas versiones, desde darle una capa de rock a temas bailables de los últimos años a meterle un groove y una voz a lo Jackson 5 a clásicos del rock setentero, algo heredado de sus inicios como grupo para tocar en fiestas universitarias. Por compararlos con algunos de sus contemporáneos te diría que son más rockeros que Vulfpeck y más funkies que Vintage Trouble pero que la cosa anda entre esas dos bandas. Este verano se lanzarán a una gira Europea por lo que tendremos oportunidad de disfrutarlos a este lado del Atlántico.

Para los amantes de géneros como el afrobeat, el funk brasileño, la bossa-nova o el highlife el sello inglés Mr.Bongo es un referente, una gente que, además de publicar novedades o de importarlas a Europa, lleva treinta años, desde la apertura de su primera tienda física en 1989 en Londres, reeditando trabajos que era extremadamente difícil conseguir, discos que se publicaron entre los 60 y los 80 en África o América Latina en sellos locales en muchos casos ya desaparecidos y que ahora ellos devuelven a la vida a través de sus múltiples subsellos. Lo que nos ocupa hoy es una de sus últimas reediciones, un trabajo de highlife que publicó el sello ghanés Essiebones music en 1982, con los legendarios Ebo Taylor y Pat Thomas, junto a la banda base Uhuru Yenzo, regalándonos media hora de música donde los géneros tradicionales de Ghana se fusionan con el funk y el jazz. Hitsville-Revisited se titula el disco compuesto por cuatro temas, de Ebo Taylor, Pat Thomas & Uhuru Yenzo.

El potencial del arte para transformar la realidad, la fuerza de la música como motor para la evolución y la transformación social, construir un mundo mejor mediante el trabajo artístico, cambiar marcos mentales a través de las producciones de la cultura popular… son cuestione elevadas, temas para el debate filosófico y sociológico. Pero también son el viento que impulsa las velas de Ith, un proyecto que busca trascender lo musical para implicarse en lo social, un grupo que a través de sus composiciones orientadas al rock más clásico busca luchar contra el soterramiento social y artístico del gallego, contra el racismo, el machismo y en general los ataques contra la diversidad y los derechos humanos. Su último vídeo, de la canción Só Eu, es una muestra de esto: una denuncia de la hipocresía de una Europa que deja morir en el Mediterráneo a miles de personas que huyen en busca de refugio y auxilio. Tal vez no sea la canción que mejor define su sonido pero sí lo es de su compromiso social.

Añadir un PDF a un sitio web usando una etiqueta de HTML5

Existen varias formas de insertar un PDF dentro de un sitio web, una de ellas es usar alguna de estas etiquetas:

  • embed
  • object
  • iframe

Antaño solo teníamos la opción de usar la etiqueta iframe, dado que embed y object se añadieron para la especificación HTML5. En todo caso el procedimiento con las tres es el mismo: ponemos la URL del fichero PDF como valor del atributo src y definimos el tamaño mediante los atributos width y height:

<!--Ejemplos varios-->
<iframe src="http://rutaamipdf/fichero.pdf" width="95%" height="100%"></iframe>

<embed src="http://rutaamipdf/fichero.pdf" width="95%" height="100%"></embed>

<object src="http://rutaamipdf/fichero.pdf" width="95%" height="100%"></object>

¿Problemas? Pues sí, que con este método dependemos de que el navegador que está usando el usuario tenga incorporado algún visualizador de PDF. En algunos casos tiene que ser mediante un plugin externo, como en Chrome, en otros ya viene incluído por defecto en el propio navegador.

Comprobar de forma fácil si un número es par en una hoja de cálculo de Google Drive

En su día habíamos visto varias soluciones para comprobar con PHP si un número es par o impar. Esto también podemos necesitarlo cuando trabajamos con una hoja de cálculo de Google Drive, por suerte ya hay una función específica para ello:

La funció ES.PAR() recibe un número como parámetro y nos devuelve un valor booleno: verdadero si es par y falso si no lo es. Así de simple. Su funcionamiento sería como en el siguiente ejemplo:

=ES.PAR(22)

Importar datos de una hoja de cálculo de Google Drive a otra con IMPORTRANGE()

En los últimos tiempos casi todos los artículos técnicos están siendo de ofimática y, más en concreto, de Google Drive. Y esta nueva entrega sigue por ahí: ¿podemos importar datos de una hoja de cálculo a otra en Google Drive? Pues sí, podemos.

La función IMPORTRANGE() se encarga de ello, recibiendo dos parámetros (dos cadenas de texto, por tanto se les envían siempre entre comillas dobles): el primer parámetro será la URL de la hoja de cálculo donde está el origen de los datos, el segundo será una cadena donde especificamos la hoja y el rango de celdas a recoger. La sintaxis es tal que así:

=IMPORTRANGE("UrlDeLaHojaDeCálculo";"NombreDeLaHoja!CeldaInicio:CeldaFin")

Os voy a dejar un ejemplo más o menos real. Tengo una hoja de cálculo donde voy guardando los discos que añadiré a la próxima revisión de los 1100 discos esenciales (cuando crezca hasta 1250, dentro de unos meses). Ahora voy a importar de esa tabla las dos primeras columnas de las 20 primeras filas. Lo haría así:

=IMPORTRANGE("https://docs.google.com/spreadsheets/d/1QqGx-f4jC3ZHi1jkSa9eY9_vY-OiClXJ1nKTDwleVpfh3I/";"Hoja 1!A1:B20")

Otro dato importante: por seguridad la primera vez que importemos los datos se nos solicitará conceder permisos explícitamente sobre la hoja de origen. Una vez concedidos, la hoja de cálculo de destino podrá extraer datos de cualquier parte de la hoja de origen hasta que el permiso se revoque también de forma explícita.

Musiqueando 4 (20190508)

Hay un puñado de productores que son genios capaces de maximizar la capacidad de trabajo de los músicos y hacerles sacar lo mejor de sí mismos a la hora de grabar sus obras, pero también hay muchos productores que pecan de exceso de conformismo o de solo saber calcar fórmulas que les han traído el éxito a otros. El otro día veía una discusión online sobre el Rocka Rolla, el disco debut de Judas Priest que no está, precisamente, entre lo más destacado de su producción. Una curiosidad respecto a esta grabación es que los temas Tyrant, Epitaph y The Ripper ya estaban compuestos, finalizados y eran interpretados por el grupo en sus directos, mientras que Victim of Changes (en aquel momento titulada provisionalmente Whisky Woman) y Dream Deceiver estaban inacabados pero el proceso de ser finalizados para la grabación. El productor, Rodger Bain, rechazó esas canciones por no ser bastante comerciales. Un año y medio después esos temas conforman el grueso de Sad Wings of Destiny, el disco que daría el impulso definitivo al grupo y que se convertiría en uno de los pilares de la historia del heavy metal. ¿Fue cosa de la discográfica o del productor? Los precedentes de Bain eran excelentes: los tres  primeros discos de Black Sabbath y los dos primeros de Budgie, es evidente que no era un inútil pero con Judas Priest se estrelló, le falló la visión y el oído rechazando canciones que se mantendrían cuatro décadas en el repertorio de la banda.

The Pilgrim es el proyecto en solitario del líder de Black Rainbows y cabeza del sello Heavy Psych Sounds, Gabriele Fiori. Su última entrega, Walking into the Forest, es un trabajo alejado del stoner metal de su banda madre, un proyecto acústico de sonido desnudo y espíritu folk. Nada de casposos MTV Unplugged de los 90 por si lo estabas pensando, lo de Fiori es real, genuino, elaborado, similiar al álbum acústico de Brant Bjork del que ya hablamos en su día, picando del Neil Young desenchufado, del lado más folk de Jethro Tull, de Crosby Stills and Nash o de la etapa setentera de Terry Reid. Moviéndose entre lo onírico, lo bucólico, lo crudo y lo desértico nos deja piezas muy variadas como el rock desenchufado de Brainstorm, el bucolismo pastoril de When I call your Name o la pura morriña en Dragonfly. Kyuss y Fu Manchu dándose la mano con Donovan y Bob Dylan.

Hablando de Dylan, le fui a ver en la última gira en su paso por Compostela. Como bien sabéis soy un gran fan suyo, le tengo una enorme admiración como leyenda de la música del siglo XX y es uno de los músicos más presentes en mi lista de 1100 discos indispensables… pero voy a confesar que salí decepcionado. Es cierto que ya sabía que la comunicación con el público del legendario cantautor es nula, que su voz está muy cambiada por la edad y que con 77 años no le íbamos a pedir un show enérgico, yo todo eso lo llevaba ya asumido. Lo que sí me esperaba es que viniese acompañado de unos músicos sobresalientes, pero el grupo de apoyo me resultó bastante justito y apático. Y los arreglos de las canciones para que encajen en el sonido más blues-rocanrol de la gira tampoco me gustaron, clásicos ya universales como Like a Rolling Stone, Highway 61 o Blowing in the Wind acaban sonando irreconocibles, dando la impresión de que todo suena más como a Roy Orbison que al viejo Dylan. El sonido del pabellón, como de costumbre en Sar, tampoco ayudó a mejorar la experiencia. Por un lado decepcionado, por otro al menos puedo decir que le pude ver en concierto, ya que en su anterior visita a la ciudad me había tocado currar. Y uno tampoco ve todos los días a un premio Nobel tocando el piano y cantando.

Hace un par de días vi una foto en Facebook, en la cuenta de los Lucifer: Johanna Sadonis y Elin Larsson juntas en un estudio. No aclaraban mucho más ¿Qué se viene? ¿Nuevo disco de Lucifer con una colaboración de Elin? ¿Nuevo disco de Blues Pills con una colaboración de Johanna? ¿Nada de eso y simplemente se sacaron una foto juntas? Pues a saber, pero al menos nos da para dejar fluir la imaginación ¿No molaría escucharlas cantar un par de temas juntas?. Lo que parece seguro es que este año Blues Pills grabarán nuevo material, a ver cómo suena el grupo tras la marcha de Dorrian Sorriaux.

Todavía no hay disco nuevo de Sacri Monti, saldrá en julio y tendremos gira europea para poder volver a verlos en directo. Pero para amenizar la espera Tee Pee Records adelanta un tema en youtube con mucho aroma setentero, una canción que me suena entre Cream y Deep Purple como primer mordisco del que será su segundo trabajo. Prometen una buena dosis de sus hard rock protometálico fusionado con psicodelia.

No soy yo muy de hip-hop pero me he enganchado a un grupo de este género: Shabazz Palaces ¿por qué? Porque es como si alguien hubiera mezclado un poco de Run DMC y otro poco de Outkast con el espíritu psicodélico de All Them Witches o Causa Sui. Ciencia ficción, retrofuturismo y fantasía evasiva abrazándose a un susurrado hip hop sobre bases electrónicas con efectos cósmicos y espaciales. En los últimos años han agregado además percusión africana y ritmos afrobeat a sus composiciones ¿Una aproximación musical al Afrofuturismo? Ahí lo dejo. Tienen cuatro discos de los que me he devorado dos especialmente: Lese Majesty y Born on a Gangster Star, además de varios pequeños directos en la icónica estación de radio KEXP que te puedes encontrar en su canal de Youtube.

Y para despedirnos otro adelanto, el del próximo disco de Peter Frampton: All Blues. El mítico ex-guitarrista de los Humble Pie y autor del clásico superventas Frampton Comes Alive! y del pegajoso Baby I love your Way (y protagonista de una mítica escena en Los Simpson, como no) anunció en febrero que dejaría de girar después de este verano, ya que le han diagnosticado una grave enfermedad llamada miositis por cuerpo de inclusión que a medio plazo le acabará afectando a los dedos, impidiéndole tocar. Esto nos hace temer que este pueda ser también el último trabajo que pueda grabar el guitarrista, que nos dejará un repaso por 10 de sus clásicos del blues favoritos versionados por su banda y con varios guitarristas invitados: Larry Carlton, Steve Morse o Kim Wilson. Desde aquí esperamos que la medicina pueda ayudarle con su condición.

Importar datos desde una web a una hoja de cálculo de Google Drive

Seguimos con el tema de la ofimática y con las hojas de cálculo de Google Drive, que parece ser un material que os interesa. Hoy vamos a ver una función muy útil aunque un poco liosa: Con IMPORTHTML() podemos importar a la hoja tablas o listados de una web.

La función recibe tres parámetros: el primero, como es lógico, es la URL de la página desde la que queremos importar los datos, irá entre comillas dobles por ser una cadena de texto. El segundo, el formato que queremos importar (puede ser “table” para tablas o “list” para listas”. Finalmente el tercero es un índice para indicar qué tabla quieres traer si hay varias dentro de la web, algo que puede ser lioso ya que a veces vamos “a ciegas” y puede que necesitemos varios ensayos de prueba y error hasta traer el dato que queremos. Por tanto la sintaxis sería tal que así:

=IMPORTHTML (dirección url; tipo de listado; índice numérico)

Vamos con un caso práctico, seguro que recuerdas que en su día vimos como exportar datos desde la web Basketball-Reference a formato Excel. Ahora vamos a hacer lo mismo pero usando directamente esta fórmula en una hoja de Google Drive:

=IMPORTHTML("https://www.basketball-reference.com/players/s/smithjr01.html";"table";1)

La línea de arriba importaría la primera tabla de la ficha de JR Smith, es decir, sus promedios en temporada regular. El resultado sería tal que así: