Kita semua tahu bahwa untuk memilih semua kolom dari sebuah tabel, kita dapat menggunakan
SELECT * FROM tableA
Apakah ada cara untuk mengecualikan kolom dari tabel tanpa menentukan semua kolom?
SELECT * [except columnA] FROM tableA
Satu-satunya cara yang saya tahu adalah menentukan secara manual semua kolom dan mengecualikan kolom yang tidak diinginkan. Ini benar-benar memakan waktu jadi saya mencari cara untuk menghemat waktu dan usaha untuk hal ini, serta pemeliharaan di masa depan jika tabel memiliki kolom lebih / kurang.
sql
sql-server
tsql
pb2q
sumber
sumber
SELECT *
kueri (OLE DB memiliki masalah pemetaan itu). Saya tidak dapat menentukan kolom yang tepat karena saya tidak memiliki akses langsung ke database MySQL, namun SQL Server cukup berbaik hati untuk memberi tahu saya nama-nama kolom char lebar tetap ...SELECT DISTINCT *
kecuali kolom kunci berfungsi tanpa baris duplikat yang dibuat orang lainJawaban:
Saya setuju dengan semua orang ... tetapi jika saya akan melakukan sesuatu seperti ini saya mungkin melakukannya dengan cara ini:
sumber
SELECT table1.ID AS table1ID ...
, IIRC.Tidak.
Praktik terbaik pemeliharaan-cahaya hanya menentukan kolom yang diperlukan.
Setidaknya 2 alasan:
Edit (Juli 2011):
Jika Anda menyeret dari objek Explorer
Columns
node ke tabel, itu menempatkan daftar CSV kolom di Jendela Kueri untuk Anda yang mencapai salah satu tujuan Andasumber
Jika Anda tidak ingin menulis setiap nama kolom secara manual, Anda dapat menggunakan
Script Table As
dengan mengklik kanan pada tabel atau melihat dalam SSMS seperti ini:Kemudian Anda akan mendapatkan seluruh kueri pemilihan di Jendela Editor Kueri Baru lalu menghapus kolom yang tidak diinginkan seperti ini:
Selesai
sumber
Cara otomatis untuk melakukan ini dalam SQL (SQL Server) adalah:
sumber
row_number()
untuk setiap baris, lalu melakukan gabungan denganrow_number
, lalu pilih semua yang mengecualikanrow_number
dari hasil gabungan.Anda dapat membuat tampilan yang memiliki kolom yang ingin Anda pilih, maka Anda hanya dapat
select *
dari tampilan ...sumber
Ya itu mungkin (tetapi tidak disarankan).
Penjelasan kode :
SELECT @variable = @variable + ... FROM
untuk menggabungkan nama kolom. JenisSELECT
ini tidak mengembalikan kumpulan hasil. Ini mungkin perilaku tidak berdokumen tetapi berfungsi di setiap versi SQL Server. Sebagai alternatif, Anda bisa menggunakannyaSET @variable = (SELECT ... FOR XML PATH(''))
untuk menggabungkan string.ISNULL
fungsi untuk menambahkan koma hanya jika ini bukan nama kolom pertama. GunakanQUOTENAME
fungsi untuk mendukung spasi dan tanda baca dalam nama kolom.WHERE
klausa untuk menyembunyikan kolom yang tidak ingin kita lihat.EXEC (@variable)
, juga dikenal sebagai SQL dinamis , untuk menyelesaikan nama kolom saat runtime. Ini diperlukan karena kami tidak tahu nama kolom pada waktu kompilasi.sumber
SELECT @columns FROM contact
Seperti yang dikatakan orang lain, tidak ada cara untuk melakukan ini, tetapi jika Anda menggunakan Sql Server, trik yang saya gunakan adalah mengubah output menjadi koma terpisah, lalu lakukan
dan memotong seluruh daftar kolom dari jendela output. Kemudian Anda dapat memilih kolom mana yang Anda inginkan tanpa harus mengetik semuanya.
sumber
Pada dasarnya, Anda tidak dapat melakukan apa yang Anda inginkan - tetapi Anda bisa mendapatkan alat yang tepat untuk membantu Anda membuat segalanya lebih mudah.
Jika Anda melihat Prompt SQL Red-Gate , Anda dapat mengetik "SELECT * FROM MyTable", dan kemudian pindahkan kursor kembali setelah "*", dan tekan <TAB> untuk memperluas daftar bidang, dan menghapus beberapa bidang yang Anda tidak perlu.
Ini bukan solusi yang sempurna - tetapi solusi yang sangat bagus! :-) Sayang sekali Intellisense MS SQL Server Management Studio masih tidak cukup cerdas untuk menawarkan fitur ini .......
Marc
sumber
tidak ada cara untuk melakukan ini. mungkin Anda dapat membuat tampilan khusus jika itu layak dalam situasi Anda
EDIT Mungkin jika DB Anda mendukung eksekusi sql dinamis, Anda dapat menulis SP dan meneruskan kolom yang tidak ingin Anda lihat dan membiarkannya membuat kueri secara dinamis dan mengembalikan hasilnya kepada Anda. Saya pikir ini bisa dilakukan di SQL Server minimal
sumber
Jika Anda menggunakan SQL Server Management Studio maka lakukan sebagai berikut:
Nikmati.
sumber
Di SQL Management Studio Anda dapat memperluas kolom di Object Explorer, lalu seret
Columns
item pohon ke jendela kueri untuk mendapatkan daftar kolom yang dipisahkan koma.sumber
Singkatnya, Anda tidak dapat melakukannya, tetapi saya tidak setuju dengan semua komentar di atas, ada "ada" skenario di mana Anda dapat secara sah menggunakan * Ketika Anda membuat kueri bersarang untuk memilih rentang tertentu dari seluruh daftar (seperti paging) mengapa di dunia ingin menentukan setiap kolom pada pernyataan pilih luar ketika Anda telah melakukannya di bagian dalam?
sumber
MEMPERBARUI:
Anda juga dapat membuat prosedur tersimpan untuk menangani tugas ini jika Anda menggunakannya lebih sering. Dalam contoh ini saya telah menggunakan built in STRING_SPLIT () yang tersedia di SQL Server 2016+, tetapi jika Anda perlu ada beberapa contoh cara membuatnya secara manual pada SO.
Dan kemudian:
sumber
Jika kita berbicara tentang Prosedur, ini berfungsi dengan trik ini untuk menghasilkan kueri baru dan Jalankan SEGERA :
sumber
Menggunakan SQL deklaratif dengan cara biasa, tidak.
Saya pikir sintaks yang Anda usulkan layak dan bagus. Bahkan, bahasa database relasional 'Tutorial D' memiliki sintaksis yang sangat mirip di mana kata kunci
ALL BUT
diikuti oleh serangkaian atribut (kolom).Namun, SQL
SELECT *
sudah mendapatkan banyak kritik (@ jawaban Guffa di sini adalah keberatan yang khas), jadi saya tidak berpikirSELECT ALL BUT
akan masuk ke dalam SQL Standard dalam waktu dekat.Saya pikir yang terbaik 'bekerja di sekitar' adalah dengan membuat
VIEW
hanya dengan kolom yang Anda inginkanSELECT * FROM ThatView
.sumber
select *
dipertanyakan - sangat berguna untuk hal-hal dan program ad hoc yang perlu menangani tabel data secara umum, tetapi tidak terlalu banyak untuk membangun (karena tidak ada kata yang lebih baik) pertanyaan 'murni'. Tetap saja, tidak berada dalam standar ANSI tidak berarti Microsoft tidak dapat menambahkannya ke dialek mereka, seperti banyak hal lainnya, tetapi saya ragu apakah mereka akan melakukannya.Dialek SQL modern seperti BigQuery mengusulkan solusi yang sangat baik
Ini adalah sintaks SQL yang sangat kuat untuk menghindari daftar panjang kolom yang perlu diperbarui setiap saat karena perubahan nama kolom tabel. Dan fungsi ini hilang dalam implementasi SQL Server saat ini, yang sangat disayangkan. Semoga, suatu hari, Microsoft Azure akan lebih ramah data ilmuwan.
Ilmuwan data ingin dapat memiliki opsi cepat untuk mempersingkat kueri dan dapat menghapus beberapa kolom (karena duplikasi atau alasan lain).
https://cloud.google.com/bigquery/docs/reference/standard-sql/query-syntax#select-modifiers
sumber
Sql Postgres memiliki cara untuk melakukannya
silakan merujuk: http://www.postgresonline.com/journal/archives/41-How-to-SELECT-ALL-EXCEPT-some-columns-in-a-table.html
Cara Peretasan Skema Informasi
Di atas untuk tabel contoh khusus saya - menghasilkan pernyataan sql yang terlihat seperti ini
SELECT o.officepark, o.owner, o.squarefootage DARI officepark As o
sumber
Saya tidak tahu ada database yang mendukung ini (SQL Server, MySQL, Oracle, PostgreSQL). Ini jelas bukan bagian dari standar SQL jadi saya pikir Anda harus menentukan hanya kolom yang Anda inginkan.
Anda tentu saja dapat membangun pernyataan SQL Anda secara dinamis dan meminta server untuk menjalankannya. Tapi ini membuka kemungkinan untuk injeksi SQL ..
sumber
Saya tahu ini agak tua, tetapi saya baru saja mengalami masalah yang sama dan sedang mencari jawaban. Kemudian saya meminta pengembang senior untuk menunjukkan trik yang sangat sederhana.
Jika Anda menggunakan editor kueri studio manajemen, perluas basis data, lalu rentangkan tabel yang Anda pilih sehingga Anda bisa melihat folder kolom.
Dalam pernyataan pilih Anda, cukup sorot folder kolom yang direferensikan di atas dan seret dan letakkan di jendela permintaan. Ini akan menempelkan semua kolom tabel, lalu cukup hapus kolom identitas dari daftar kolom ...
sumber
SELECT * Except(tableName.ColumnName) FROM ...
Cara terbaik untuk mengatasi ini adalah menggunakan tampilan Anda dapat membuat tampilan dengan kolom yang diperlukan dan mengambil data dari itu
sumber
Misalnya, jika Anda ingin mengecualikan kolom case sensitif seperti kata sandi, saya melakukan ini untuk menyembunyikan nilainya:
SELECT * , "" as password FROM tableName;
sumber
Ya, itu adalah praktik terbaik yang umum untuk menentukan kolom mana yang Anda inginkan, bukan hanya menentukan *. Jadi Anda hanya harus menyatakan bidang mana yang ingin Anda pilih untuk dikembalikan.
sumber
Seorang kolega menyarankan alternatif yang baik:
Selesai ...
Ini sangat membantu kami.
sumber
Klik kanan tabel di Object Explorer, Pilih 1000 baris teratas
Ini akan mencantumkan semua kolom dan bukan *. Kemudian hapus kolom yang tidak diinginkan. Seharusnya lebih cepat daripada mengetik sendiri.
Kemudian ketika Anda merasa ini adalah pekerjaan yang terlalu banyak, dapatkan Prompt SQL Red Gate, dan ketik ssf dari tbl, buka * dan klik tab lagi.
sumber
Itulah yang sering saya gunakan untuk kasus ini:
@colnames
seperticolumn1,column2,column5
sumber
Terkadang program yang sama harus menangani struktur database yang berbeda. Jadi saya tidak bisa menggunakan daftar kolom dalam program untuk menghindari kesalahan dalam
select
pernyataan.*
memberi saya semua bidang opsional. Saya memeriksa apakah bidang ada di tabel data sebelum digunakan. Ini adalah alasan saya untuk menggunakan*
diselect
.Inilah cara saya menangani bidang yang dikecualikan:
sumber
Saya tahu pertanyaan ini sudah lama, tapi saya harap ini masih bisa membantu. Jawabannya terinspirasi oleh diskusi dari Forum SQL Server . Anda dapat menjadikan ini sebagai prosedur tersimpan . Itu juga dapat dimodifikasi untuk menambahkan lebih dari satu kecuali bidang.
sumber
Bukankah lebih mudah untuk melakukan ini:
-Klik pada kolom 'Column_name'> Salin> Tempel (membuat daftar vertikal) ke dalam jendela Permintaan Baru dan cukup ketik koma di depan setiap nilai kolom ... komentar kolom yang tidak Anda inginkan ... jauh lebih sedikit mengetik daripada kode apa pun yang ditawarkan di sini dan masih dapat dikelola.
sumber
Anda bisa mendapatkan SQL Complete dari devart.com, yang tidak hanya memperluas * wildcard seperti halnya SQL Prompt dari Red Gate (seperti yang dijelaskan dalam jawaban cairnz), tetapi juga menyediakan pemilih kolom drop-down dengan kotak centang di mana Anda dapat memeriksa semua kolom yang Anda inginkan dalam daftar pilih dan mereka akan dimasukkan secara otomatis untuk Anda (dan jika Anda menghapus centang kolom itu akan secara otomatis dihapus dari daftar pilih).
sumber
Di SSMS ada cara yang lebih mudah dengan IntelliSense dan Aliasing . Coba ini
sumber