Todos sabemos que para seleccionar todas las columnas de una tabla, podemos usar
SELECT * FROM tableA
¿Hay alguna manera de excluir columnas de una tabla sin especificar todas las columnas?
SELECT * [except columnA] FROM tableA
La única forma que sé es especificar manualmente todas las columnas y excluir la columna no deseada. Esto lleva mucho tiempo, por lo que estoy buscando formas de ahorrar tiempo y esfuerzo en esto, así como el mantenimiento futuro en caso de que la tabla tenga más / menos columnas.
sql
sql-server
tsql
pb2q
fuente
fuente
SELECT *
consulta (OLE DB tiene problemas para mapearlas). No podía especificar las columnas de la derecha porque no tenía acceso directo a la base de datos MySQL, SQL Server, sin embargo tuvo la amabilidad de informarme de los nombres de la anchura de las columnas CHAR fijo ...SELECT DISTINCT *
excepción de que la columna clave funcione sin filas duplicadas que otra persona haya creadoRespuestas:
Estoy de acuerdo con todos ... pero si fuera a hacer algo como esto, podría hacerlo de esta manera:
fuente
SELECT table1.ID AS table1ID ...
, IIRC.No.
La mejor práctica de mantenimiento ligero es especificar solo las columnas requeridas.
Al menos 2 razones:
Editar (julio de 2011):
Si arrastra desde el Explorador de objetos el
Columns
nodo para una tabla, coloca una lista CSV de columnas en la Ventana de consulta para usted, lo que logra uno de sus objetivosfuente
Si no desea escribir cada nombre de columna manualmente, puede usarlo
Script Table As
haciendo clic derecho en la tabla o ver en SSMS de esta manera:Luego obtendrá una consulta de selección completa en la Nueva ventana del editor de consultas y luego eliminará la columna no deseada como esta:
Hecho
fuente
La forma automatizada de hacer esto en SQL (SQL Server) es:
fuente
row_number()
cada fila, luego realice una unión porrow_number
, luego seleccione todo exceptorow_number
el resultado de la unión.Puede crear una vista que tenga las columnas que desea seleccionar, luego puede simplemente
select *
desde la vista ...fuente
Sí, es posible (pero no recomendado).
Explicación del código :
SELECT @variable = @variable + ... FROM
para concatenar los nombres de columna. Este tipo deSELECT
no devuelve un conjunto de resultados. Este es quizás un comportamiento no documentado, pero funciona en todas las versiones de SQL Server. Como alternativa, puede usarSET @variable = (SELECT ... FOR XML PATH(''))
para concatenar cadenas.ISNULL
función para anteponer una coma solo si este no es el nombre de la primera columna. Use laQUOTENAME
función para admitir espacios y puntuación en los nombres de columna.WHERE
cláusula para ocultar columnas que no queremos ver.EXEC (@variable)
, también conocido como SQL dinámico , para resolver los nombres de columna en tiempo de ejecución. Esto es necesario porque no conocemos los nombres de las columnas en tiempo de compilación.fuente
SELECT @columns FROM contact
Como los otros han dicho, no hay forma de hacer esto, pero si está usando SQL Server, un truco que uso es cambiar la salida a coma separada, entonces haga
y cortar la lista completa de columnas de la ventana de salida. Luego puede elegir qué columnas desea sin tener que escribirlas todas.
fuente
Básicamente, no puede hacer lo que le gustaría, pero puede obtener las herramientas adecuadas para ayudarlo a hacer las cosas un poco más fáciles.
Si observa la solicitud SQL de Red-Gate , puede escribir "SELECCIONAR * DE MyTable", y luego mover el cursor hacia atrás después de "*", y presionar <TAB> para expandir la lista de campos, y eliminar esos pocos campos que no necesito
No es una solución perfecta, ¡pero es una muy buena! :-) Lástima que Intellisense de MS SQL Server Management Studio todavía no sea lo suficientemente inteligente como para ofrecer esta característica .......
Bagazo
fuente
no, no hay forma de hacer esto. tal vez pueda crear vistas personalizadas si eso es factible en su situación
EDITAR Puede ser si su base de datos admite la ejecución de sql dinámico. Podría escribir un SP y pasar las columnas que no desea ver y dejar que cree la consulta dinámicamente y le devuelva el resultado. Creo que esto es factible en SQL Server al menos
fuente
Si está utilizando SQL Server Management Studio, haga lo siguiente:
Disfrutar.
fuente
En SQL Management Studio puede expandir las columnas en el Explorador de objetos, luego arrastrar el
Columns
elemento del árbol a una ventana de consulta para obtener una lista de columnas separadas por comas.fuente
En resumen, no puede hacerlo, pero no estoy de acuerdo con todos los comentarios anteriores, hay "escenarios" en los que puede usar legítimamente un * cuando crea una consulta anidada para seleccionar un rango específico de una lista completa (como paginación) ¿por qué en el mundo desearía especificar cada columna en la declaración de selección externa cuando lo ha hecho en la interna?
fuente
ACTUALIZAR:
También puede crear un procedimiento almacenado para encargarse de esta tarea si la usa con más frecuencia. En este ejemplo, he usado el STRING_SPLIT () que está disponible en SQL Server 2016+, pero si lo necesita, hay muchos ejemplos de cómo crearlo manualmente en SO.
Y luego solo:
fuente
Si hablamos de procedimientos, funciona con este truco para generar una nueva consulta y EJECUTARLA INMEDIATA :
fuente
Usando SQL declarativo de la manera usual, no.
Creo que su sintaxis propuesta es digna y buena. De hecho, el lenguaje de base de datos relacional 'Tutorial D' tiene una sintaxis muy similar donde las palabras clave
ALL BUT
van seguidas de un conjunto de atributos (columnas).Sin embargo, el SQL
SELECT *
ya recibe muchas críticas (la respuesta de @ Guffa aquí es una objeción típica), por lo que no creoSELECT ALL BUT
que llegue al Estándar SQL pronto.Creo que el mejor 'trabajo' es crear una
VIEW
con solo las columnas que desee en ese momentoSELECT * FROM ThatView
.fuente
select *
es cuestionable, muy útil para cosas y programas ad hoc que necesitan manejar genéricamente tablas de datos, pero no tanto para construir (a falta de una palabra mejor) consultas 'puras'. Aún así, no estar en el estándar ANSI no significa que Microsoft no pueda agregarlo a su dialecto, como con muchas otras cosas, pero soy escéptico sobre si lo harían.Un dialecto SQL moderno como BigQuery propone una excelente solución
Esta es una sintaxis SQL muy poderosa para evitar una larga lista de columnas que deben actualizarse todo el tiempo debido a cambios en el nombre de la columna de la tabla. Y esta funcionalidad falta en la implementación actual de SQL Server, lo cual es una pena. Con suerte, algún día, Microsoft Azure será más amigable con los científicos de datos.
A los científicos de datos les gusta poder tener una opción rápida para acortar una consulta y poder eliminar algunas columnas (debido a la duplicación o cualquier otra razón).
https://cloud.google.com/bigquery/docs/reference/standard-sql/query-syntax#select-modifiers
fuente
Postgres sql tiene una forma de hacerlo
consulte: http://www.postgresonline.com/journal/archives/41-How-to-SELECT-ALL-EXCEPT-some-columns-in-a-table.html
El esquema de información Hack Way
Lo anterior para mi tabla de ejemplo particular: genera una instrucción sql que se ve así
SELECCIONE o.officepark, o.owner, o.squarefootage FROM officepark As o
fuente
No conozco ninguna base de datos que soporte esto (SQL Server, MySQL, Oracle, PostgreSQL). Definitivamente no es parte de los estándares SQL, así que creo que debe especificar solo las columnas que desea.
Por supuesto, podría construir su declaración SQL de forma dinámica y hacer que el servidor la ejecute. Pero esto abre la posibilidad de inyección SQL.
fuente
Sé que esto es un poco viejo, pero acababa de encontrarme con el mismo problema y estaba buscando una respuesta. Luego tuve un desarrollador senior que me mostró un truco muy simple.
Si está utilizando el editor de consultas de Management Studio, expanda la base de datos, luego expanda la tabla que está seleccionando para que pueda ver la carpeta de columnas.
En su declaración de selección, solo resalte la carpeta de columnas referenciadas arriba y arrástrela y suéltela en la ventana de consulta. Pegará todas las columnas de la tabla, luego simplemente eliminará la columna de identidad de la lista de columnas ...
fuente
SELECT * Except(tableName.ColumnName) FROM ...
La mejor manera de resolver esto es usando la vista, puede crear una vista con las columnas requeridas y recuperar datos de ella
fuente
Si desea excluir una columna de mayúsculas y minúsculas como la contraseña, por ejemplo, hago esto para ocultar el valor:
SELECT * , "" as password FROM tableName;
fuente
Bueno, es una práctica recomendada común especificar qué columnas desea, en lugar de solo especificar *. Por lo tanto, debe indicar qué campos desea que devuelva su selección.
fuente
Un colegio aconseja una buena alternativa:
Hecho...
Esto nos ayudó mucho.
fuente
Haga clic con el botón derecho en la tabla en el Explorador de objetos, seleccione las 1000 filas superiores
Enumerará todas las columnas y no *. Luego, elimine las columnas no deseadas. Debería ser mucho más rápido que escribirlo usted mismo.
Luego, cuando sienta que esto es demasiado trabajo, obtenga el mensaje SQL de Red Gate y escriba ssf desde tbl, vaya a * y haga clic en la pestaña nuevamente.
fuente
Que lo uso a menudo para este caso:
@colnames
parececolumn1,column2,column5
fuente
A veces, el mismo programa debe manejar diferentes estructuras de bases de datos. Por lo tanto, no podría usar una lista de columnas en el programa para evitar errores en las
select
declaraciones.*
me da todos los campos opcionales Compruebo si los campos existen en la tabla de datos antes de usarlos. Este es mi razón para usar*
enselect
.Así es como manejo los campos excluidos:
fuente
Sé que esta pregunta es antigua, pero espero que aún pueda ser útil. La respuesta está inspirada en un debate de los foros de SQL Server . Puede hacer de esto un procedimiento almacenado . También se puede modificar para agregar más de uno, excepto los campos.
fuente
¿No sería más simple hacer esto?
-Haga clic en la columna 'Column_name'> Copiar> Pegar (crea una lista vertical) en una ventana Nueva consulta y simplemente escriba comas delante del valor de cada columna ... comente las columnas que no desea ... mucho menos escribiendo que cualquier código ofrecido aquí y aún manejable.
fuente
Puede obtener SQL Complete de devart.com, que no solo expande el comodín * al igual que lo hace SQL Prompt de Red Gate (como se describe en la respuesta de cairnz), sino que también proporciona un menú desplegable de selección de columnas con casillas de verificación en las que puede marcar todos los columnas que desee en la lista de selección y se insertarán automáticamente por usted (y si desmarca una columna, se eliminará automáticamente de la lista de selección).
fuente
En SSMS hay una manera más fácil con IntelliSense y Aliasing . Prueba esto
fuente