Saya bertanya-tanya apakah ini mungkin dalam SQL. Katakanlah Anda memiliki dua tabel A dan B, dan Anda memilih di tabel A dan bergabung di tabel B:
SELECT a.*, b.* FROM TABLE_A a JOIN TABLE_B b USING (some_id);
Jika tabel A memiliki kolom 'a_id', 'name', dan 'some_id', dan tabel B memiliki 'b_id', 'name', dan 'some_id', kueri akan mengembalikan kolom 'a_id', 'name', 'some_id ',' b_id ',' name ',' some_id '. Apakah ada cara untuk mengawali nama kolom pada tabel B tanpa mencantumkan setiap kolom secara terpisah? Setara dengan ini:
SELECT a.*, b.b_id as 'b.b_id', b.name as 'b.name', b.some_id as 'b.some_id'
FROM TABLE_A a JOIN TABLE_B b USING (some_id);
Tapi, seperti yang disebutkan, tanpa mencantumkan setiap kolom, jadi sesuatu seperti:
SELECT a.*, b.* as 'b.*'
FROM TABLE_A a JOIN TABLE_B b USING (some_id);
Pada dasarnya sesuatu untuk dikatakan, "awali setiap kolom dikembalikan oleh b. * Dengan 'sesuatu'". Apakah ini mungkin atau saya kurang beruntung?
Terima kasih sebelumnya atas bantuan Anda!
EDIT: saran tentang tidak menggunakan SELECT * dan sebagainya adalah saran yang valid tetapi tidak relevan dalam konteks saya, jadi tolong tetap pada masalah yang ada - apakah mungkin untuk menambahkan awalan (konstanta yang ditentukan dalam permintaan SQL) ke semua nama kolom dari suatu tabel dalam suatu gabungan?
EDIT: tujuan akhir saya adalah untuk dapat melakukan SELECT * pada dua tabel dengan join, dan dapat mengetahui, dari nama-nama kolom yang saya dapatkan di set hasil saya, kolom mana yang berasal dari tabel A dan kolom mana yang berasal dari tabel B. Sekali lagi, saya tidak ingin harus membuat daftar kolom satu per satu, saya harus dapat melakukan SELECT *.
Jawaban:
Saya melihat dua kemungkinan situasi di sini. Pertama, Anda ingin tahu apakah ada standar SQL untuk ini, yang dapat Anda gunakan secara umum terlepas dari database. Tidak, tidak ada. Kedua, Anda ingin tahu tentang produk dbms tertentu. Maka Anda perlu mengidentifikasinya. Tapi saya membayangkan jawaban yang paling mungkin adalah Anda akan mendapatkan kembali sesuatu seperti "a.id, b.id" karena itulah bagaimana Anda perlu mengidentifikasi kolom dalam ekspresi SQL Anda. Dan cara termudah untuk mengetahui apa defaultnya, adalah dengan mengirimkan pertanyaan seperti itu dan melihat apa yang Anda dapatkan kembali. Jika Anda ingin menentukan awalan apa yang muncul sebelum titik, Anda dapat menggunakan "SELECT * FROM AS my_alias", misalnya.
sumber
Tampaknya jawaban untuk pertanyaan Anda adalah tidak, namun satu peretasan yang dapat Anda gunakan adalah dengan menetapkan kolom dummy untuk memisahkan setiap tabel baru. Ini berfungsi terutama jika Anda mengulang hasil yang ditetapkan untuk daftar kolom dalam bahasa scripting seperti Python atau PHP.
Saya menyadari ini tidak menjawab pertanyaan Anda dengan tepat, tetapi jika Anda seorang pembuat kode, ini adalah cara yang bagus untuk memisahkan tabel dengan nama kolom duplikat. Semoga ini bisa membantu seseorang.
sumber
Saya benar-benar mengerti mengapa ini perlu - setidaknya bagi saya itu berguna selama prototyping cepat ketika ada banyak tabel yang perlu digabungkan, termasuk banyak sambungan dalam. Segera setelah nama kolom sama dengan wild card bidang "gabungan. *" Kedua, nilai bidang tabel utama diganti dengan nilai gabungan. Kesalahan rawan, membuat frustrasi, dan pelanggaran KERING ketika harus secara manual menentukan bidang tabel dengan alias berulang-ulang ...
Berikut adalah fungsi PHP (Wordpress) untuk mencapai hal ini melalui pembuatan kode bersama dengan contoh cara menggunakannya. Dalam contoh, ini digunakan untuk secara cepat menghasilkan kueri khusus yang akan menyediakan bidang-bidang posting wordpress terkait yang direferensikan melalui bidang bidang khusus lanjutan .
Hasil:
sumber
Satu-satunya database yang saya tahu melakukan ini adalah SQLite, tergantung pada pengaturan yang Anda konfigurasikan dengan
PRAGMA full_column_names
danPRAGMA short_column_names
. Lihat http://www.sqlite.org/pragma.htmlKalau tidak, yang bisa saya rekomendasikan adalah mengambil kolom dalam hasil yang ditentukan oleh posisi ordinal daripada dengan nama kolom, jika terlalu banyak masalah bagi Anda untuk mengetikkan nama kolom dalam permintaan Anda.
Ini adalah contoh yang baik mengapa itu praktik yang buruk untuk digunakan
SELECT *
- karena pada akhirnya Anda akan perlu mengetikkan semua nama kolom.Saya memahami perlunya mendukung kolom yang dapat mengubah nama atau posisi, tetapi menggunakan wildcard menjadikannya lebih sulit , bukan lebih mudah.
sumber
full_column_names
danshort_column_names
sudah usang dalam SQLite.Saya memiliki jenis perahu yang sama dengan OP - Saya memiliki lusinan bidang dari 3 tabel berbeda yang saya gabungkan, beberapa di antaranya memiliki nama yang sama (mis. Id, nama, dll). Saya tidak ingin mencantumkan setiap bidang, jadi solusi saya adalah dengan alias bidang yang membagikan nama dan menggunakan pilih * untuk bidang yang memiliki nama unik.
Sebagai contoh :
tabel a: id, nama, field1, field2 ...
tabel b: id, nama, field3, field4 ...
pilih a.id sebagai aID, a.name sebagai aName, a. *, b.id sebagai bID, b.name sebagai bName, b. * .....
Saat mengakses hasil, saya memberikan nama alias untuk bidang ini dan mengabaikan nama "asli".
Mungkin bukan solusi terbaik tetapi berfungsi untuk saya .... saya menggunakan mysql
sumber
Produk basis data yang berbeda akan memberikan jawaban yang berbeda; tetapi Anda membuat diri Anda terluka jika Anda membawa ini sejauh ini. Anda jauh lebih baik memilih kolom yang Anda inginkan, dan memberi mereka alias Anda sendiri sehingga identitas setiap kolom sejernih kristal, dan Anda dapat membedakannya dalam hasil.
sumber
Pertanyaan ini sangat berguna dalam praktiknya. Anda hanya perlu mencantumkan setiap kolom eksplisit dalam pemrograman perangkat lunak, tempat Anda membayar khusus untuk menangani semua kondisi.
Bayangkan ketika melakukan debugging, atau, coba gunakan DBMS sebagai alat kantor harian, alih-alih sesuatu yang bisa diubah implementasi dari infrastruktur abstrak yang mendasari programmer tertentu, kita perlu kode banyak SQL. Skenario dapat ditemukan di mana-mana, seperti konversi basis data, migrasi, administrasi, dll. Sebagian besar dari SQL ini akan dieksekusi hanya sekali dan tidak pernah digunakan lagi, memberikan setiap kolom nama hanya buang-buang waktu. Dan jangan lupa penemuan SQL tidak hanya untuk penggunaan programer.
Biasanya saya akan membuat tampilan utilitas dengan nama kolom diawali, di sini adalah fungsi di pl / pgsql, itu tidak mudah tetapi Anda dapat mengubahnya ke bahasa prosedur lainnya.
Contoh:
sumber
Saya benar-benar mengerti masalah Anda tentang nama bidang yang digandakan.
Saya juga membutuhkannya sampai saya mengkodekan fungsi saya sendiri untuk menyelesaikannya. Jika Anda menggunakan PHP, Anda dapat menggunakannya, atau kode Anda dalam bahasa yang Anda gunakan jika Anda memiliki fasilitas berikut ini.
Kuncinya di sini adalah
mysql_field_table()
mengembalikan nama tabel danmysql_field_name()
bidang untuk setiap baris dalam hasil jika adamysql_num_fields()
sehingga Anda dapat mencampurnya dalam array baru.Ini mengawali semua kolom;)
Salam,
sumber
Tidak ada standar SQL untuk ini.
Namun Dengan pembuatan kode (baik berdasarkan permintaan saat tabel dibuat atau diubah atau saat runtime), Anda dapat melakukan ini dengan mudah:
sumber
Ada dua cara yang dapat saya pikirkan untuk mewujudkan hal ini dengan cara yang dapat digunakan kembali. Pertama adalah mengganti nama semua kolom Anda dengan awalan untuk tabel asal mereka. Saya telah melihat ini berkali-kali, tetapi saya benar-benar tidak menyukainya. Saya menemukan bahwa itu berlebihan, menyebabkan banyak pengetikan, dan Anda selalu dapat menggunakan alias ketika Anda perlu untuk menutupi kasus nama kolom yang memiliki asal tidak jelas.
Cara lain, yang saya sarankan Anda lakukan dalam situasi Anda jika Anda berkomitmen untuk melihat ini, adalah untuk membuat tampilan untuk setiap tabel yang alias nama tabel. Kemudian Anda bergabung dengan pandangan itu, bukan tabel. Dengan begitu, Anda bebas menggunakan * jika ingin, bebas menggunakan tabel asli dengan nama kolom asli jika Anda mau, dan itu juga membuat penulisan kueri selanjutnya menjadi lebih mudah karena Anda telah melakukan pekerjaan penggantian nama dalam tampilan.
Akhirnya, saya tidak jelas mengapa Anda perlu tahu dari tabel mana masing-masing kolom berasal. Apakah ini masalah? Pada akhirnya yang penting adalah data yang dikandungnya. Apakah UserID berasal dari tabel Pengguna atau tabel UserQuestion tidak terlalu penting. Itu penting, tentu saja, ketika Anda perlu memperbaruinya, tetapi pada saat itu Anda harus sudah mengetahui skema Anda dengan cukup baik untuk menentukan itu.
sumber
Atau Anda bisa menggunakan Red Gate SQL Refactor atau SQL Prompt, yang memperluas SELECT * Anda ke dalam daftar kolom dengan mengklik tombol Tab
jadi dalam kasus Anda, jika Anda mengetikkan SELECT * FROM A JOIN B ... Pergi ke akhir *, tombol Tab, voila! Anda akan melihat SELECT A.column1, A.column2, ...., B.column1, B.column2 DARI A JOIN B
Ini tidak gratis
sumber
Tidak dapat melakukan ini tanpa alias, hanya karena, bagaimana Anda akan merujuk bidang dalam klausa where, jika bidang itu ada di 2 atau 3 tabel yang Anda gabungkan? Tidak jelas untuk mysql yang mana yang Anda coba rujuk.
sumber
Saya memecahkan masalah yang sama dengan menamai ulang bidang dalam tabel yang terlibat. Ya, saya memiliki hak istimewa untuk melakukan ini dan memahami bahwa semua orang mungkin tidak memilikinya. Saya menambahkan awalan ke setiap bidang dalam tabel yang mewakili nama tabel. Dengan demikian SQL yang diposting oleh OP akan tetap tidak berubah -
dan masih memberikan hasil yang diharapkan - kemudahan mengidentifikasi tabel mana bidang output milik.
sumber
pilih * biasanya membuat kode buruk, karena kolom baru cenderung ditambahkan atau urutan kolom berubah dalam tabel yang cukup sering yang biasanya memecah pilih * dengan cara yang sangat halus. Jadi daftar kolom adalah solusi yang tepat.
Tentang cara melakukan kueri Anda, tidak yakin tentang mysql tetapi dalam sqlserver Anda bisa memilih nama kolom dari syscolumns dan secara dinamis membangun klausa pilih.
sumber
Jika khawatir tentang perubahan skema, ini mungkin berfungsi untuk Anda: 1. Jalankan kueri 'DESCRIBE table' di semua tabel yang terlibat. 2. Gunakan nama bidang yang dikembalikan untuk secara dinamis membangun serangkaian nama kolom yang diawali dengan alias yang Anda pilih.
sumber
Ada jawaban langsung untuk pertanyaan Anda bagi mereka yang menggunakan MySQL C-API.
Mengingat SQL:
Hasil dari 'mysql_stmt_result_metadata ()' memberikan definisi bidang Anda dari kueri SQL yang disiapkan ke dalam struktur MYSQL_FIELD []. Setiap bidang berisi data berikut:
Perhatikan bidang: katalog, tabel, org_name
Anda sekarang tahu bidang mana dalam SQL Anda yang termasuk skema (alias katalog) dan tabel mana. Ini cukup untuk secara umum mengidentifikasi setiap bidang dari kueri multi-tabel sql, tanpa harus alias apa pun.
SqlYOG produk aktual ditunjukkan untuk menggunakan data yang tepat ini di manor sehingga mereka dapat memperbarui setiap tabel gabungan multi-tabel secara independen, saat bidang PK ada.
sumber
Berkembang dari solusi ini , inilah cara saya mendekati masalah:
Pertama buat daftar semua
AS
pernyataan:Kemudian gunakan dalam permintaan Anda:
Namun, ini mungkin perlu modifikasi karena sesuatu yang serupa hanya diuji dalam SQL Server. Tetapi kode ini tidak benar-benar berfungsi di SQL Server karena MENGGUNAKAN tidak didukung.
Berikan komentar jika Anda dapat menguji / memperbaiki kode ini untuk mis. MySQL.
sumber
Baru-baru ini mengalami masalah ini di NodeJS dan Postgres.
Pendekatan ES6
Tidak ada fitur RDBMS yang saya tahu menyediakan fungsi ini, jadi saya membuat objek yang berisi semua bidang saya, misalnya:
Menetapkan reducer untuk menggabungkan string bersama dengan nama tabel:
Ini mengembalikan array string. Sebut saja untuk setiap tabel dan gabungkan hasilnya:
Keluarkan pernyataan SQL terakhir:
sumber
Saya menerapkan solusi berdasarkan jawaban yang menyarankan menggunakan kolom dummy atau sentinel di node. Anda akan menggunakannya dengan menghasilkan SQL seperti:
Dan kemudian pasca-pemrosesan, baris yang Anda dapatkan dari driver basis data Anda seperti
addPrefixes(row)
.Implementasi (berdasarkan
fields
/rows
dikembalikan oleh driver saya, tetapi harus mudah diubah untuk driver DB lainnya):Uji:
sumber
Apa yang saya lakukan adalah menggunakan Excel untuk menggabungkan prosedur. Misalnya, pertama saya pilih * dan dapatkan semua kolom, tempel di Excel. Kemudian tulis kode yang saya butuhkan untuk mengelilingi kolom. Katakanlah saya perlu iklan sebelum sekelompok kolom. Saya akan memiliki bidang saya di kolom a dan "as prev_" di kolom B dan bidang saya lagi di kolom c. Di kolom d saya akan memiliki kolom.
Kemudian gunakan concatanate di kolom e dan gabungkan keduanya, pastikan untuk memasukkan spasi. Kemudian potong dan tempel ini ke dalam kode sql Anda. Saya juga menggunakan metode ini untuk membuat pernyataan kasus untuk bidang yang sama dan kode lain lagi yang perlu saya lakukan untuk setiap bidang dalam tabel bidang multihundred.
sumber
Dalam postgres, saya menggunakan fungsi json untuk mengembalikan objek json .... lalu, setelah kueri, saya json_decode bidang dengan akhiran _json.
YAITU:
kemudian dalam PHP (atau bahasa lain), saya loop melalui kolom yang dikembalikan dan json_decode () mereka jika mereka memiliki akhiran "_json" (juga menghapus akhiran. Pada akhirnya, saya mendapatkan objek bernama "tab1" yang mencakup semua bidang tab1, dan bidang lain yang disebut "tab2" yang mencakup semua bidang tab2.
sumber
PHP 7.2 + MySQL / Mariadb
MySQL akan mengirimkan Anda beberapa bidang dengan nama yang sama. Bahkan di klien terminal. Tetapi jika Anda menginginkan array asosiatif, Anda harus membuat kunci sendiri.
Terima kasih kepada @axelbrz untuk aslinya. Saya telah porting ke php yang lebih baru dan membersihkannya sedikit:
sumber