Subkueri untuk mengambil nama tabel

Saya punya pertanyaan seperti ini:

SELECT * FROM (SELECT linktable FROM adm_linkedfields WHERE name = 'company') as cbo WHERE group='BEST'

Pada dasarnya, nama tabel untuk query utama diambil melalui subquery.

Saya mendapatkan kesalahan yang #1054 - Unknown column 'group' in 'where clause'

Ketika saya menyelidiki (menghapus klausa di mana), saya menemukan bahwa kueri hanya mengembalikan hasil subkueri setiap saat.

Tabel subkueri adm_linkedfields memiliki struktur id | name | linktable

Saat ini saya menggunakan MySQL dengan PDO tetapi kuerinya harus kompatibel dengan DB utama (yaitu Oracle, MSSQL, PgSQL, dan MySQL)

Pembaruan: Subkueri harus mengembalikan nama tabel untuk kueri utama. Dalam hal ini akan mengembalikan tbl_company

Tabel tbl_company untuk kueri utama memiliki struktur ini: id | name | group

Terima kasih sebelumnya.


person Ravi    schedule 23.06.2013    source sumber
comment
lihat jawaban saya karena alasan kesalahan. BTW dari mana grup kolom itu berasal..itu tidak ada dalam definisi tabel Anda?? dan itu DT bukan SubQ.   -  person cosmos    schedule 23.06.2013
comment
Mengapa tidak memilih? Hargai jika ada alasan yang diberikan.   -  person Ravi    schedule 23.06.2013
comment
@ user2407394 dia memanggil kolom grup di klausa WHERE tetapi subkueri hanya mengembalikan satu kolom yang disebut linktable.   -  person Jakub Kania    schedule 23.06.2013
comment
@jakub: Ini DT bukan subQ. Dia memperbarui pertanyaan setelah komentar saya.. @ Ravi: Terima kasih atas pembaruannya. Sekarang saya mengerti apa yang ingin Anda lakukan. Saya cenderung setuju dengan jawaban Jakub. -1 karena kurangnya detail. Menghapusnya.   -  person cosmos    schedule 23.06.2013


Jawaban (3)


SQL Dinamis tidak berfungsi seperti itu, yang Anda buat adalah tampilan sebaris, bacalah itu. Terlebih lagi, Anda tidak dapat membuat kueri sql dinamis yang akan berfungsi pada setiap db. Jika Anda memiliki tabel tautan dalam jumlah terbatas, Anda dapat mencoba menggunakan gabungan kiri atau gabungan untuk memilih dari semua tabel, tetapi jika Anda tidak memiliki alasan yang kuat, Anda tidak menginginkannya. Cukup pilih nama tabel dalam satu kueri lalu buat kueri lain untuk mengakses tabel yang tepat (dengan membuat string kueri di php).

person Jakub Kania    schedule 23.06.2013
comment
Terima kasih Jakub. Saya baru saja melakukan itu. Ingin tahu apakah saya bisa melakukannya dalam satu permintaan daripada melakukan dua panggilan. - person Ravi; 23.06.2013

Ini masalahnya:

SELECT * FROM (SELECT linktable FROM adm_linkedfields WHERE name = 'company') as cbo 
WHERE group='BEST';

Anda memilih dari DT yang hanya berisi satu kolom "linktable", maka Anda tidak dapat meletakkan kolom lain di klausa mana dari blok luar. Pikirkan dalam hal blok, pilihan luar merujuk pada DT yang hanya berisi satu kolom.

Masalah Anda serupa ketika Anda mencoba melakukan:

create table t1(x1 int);
select * from t1 where z1 = 7;  //error
person cosmos    schedule 23.06.2013
comment
Terima kasih. Saya menyimpan nama tabel saya di tabel lain (yang saya coba ambil melalui subkueri) dan ingin mengembalikan semua baris dari tabel itu. Saya telah memberikan struktur tabel target saya dalam pembaruan jika itu bisa membantu. - person Ravi; 23.06.2013

Permintaan Anda adalah:

SELECT *
FROM (SELECT linktable
      FROM adm_linkedfields
      WHERE name = 'company'
     ) cbo
WHERE group='BEST'

Pertama, jika Anda tertarik dengan kompatibilitas lintas database, jangan beri nama kolom atau tabel dengan kata khusus SQL. group adalah nama yang sangat, sangat buruk untuk sebuah kolom.

Kedua, klausa from mengembalikan tabel yang berisi daftar nama (tabel, tapi itu tidak relevan). Tidak ada kolom bernama group, jadi itulah masalah yang Anda alami.

Apa yang dapat Anda lakukan untuk memperbaikinya? Solusi yang naif adalah dengan menjalankan subkueri, menjalankannya, dan menggunakan nama tabel yang dihasilkan dalam pernyataan dinamis untuk menjalankan kueri yang Anda inginkan.

Masalah mendasarnya adalah struktur data Anda. Memiliki beberapa tabel dengan struktur yang sama umumnya merupakan tanda desain yang buruk. Anda pada dasarnya memiliki dua pilihan.

Satu. Jika Anda memiliki kendali atas struktur database, letakkan semua data dalam satu tabel, misalnya linktable. Ini akan berisi informasi untuk semua perusahaan, dan kolom untuk group (atau apa pun namanya). Solusi ini kompatibel di semua database. Jika Anda memiliki banyak sekali data dalam tabel (pikirkan puluhan juta baris), maka Anda mungkin mempertimbangkan untuk mempartisi data karena alasan kinerja.

Dua. Jika Anda tidak memiliki kendali atas data, buatlah tampilan yang menggabungkan semua tabel menjadi satu. Sesuatu seperti:

create view vw_linktable as
    select 'table1' as which, t.* from table1 t union all
    select 'table2', t.* from table2 t

Ini juga kompatibel di semua database.

person Gordon Linoff    schedule 23.06.2013