Pertanyaan bagaimana menjaga ketertiban saat melakukan join di sql


tabel 1 dan tabel 2 memiliki kunci utama (key1, key2) untuk menjadi sama. tabel 3 adalah tabel yang ditentukan pengguna dengan satu kolom field5 yang umum untuk table2. Saya harus memilih baris dari tabel 1 dan tabel 2 di mana field5 di table2 ada di tabel3. Saya perlu mendapatkan baris dalam urutan yang sama dengan table3.

Tabel 1

key1 key2 field1 field2

Meja 2

key1 key2 field3 field4 field5

tabel yang ditentukan pengguna

field5

pertanyaan yang saya pikirkan adalah

select a.key1, a.key2, a.field1, a.field2, b.field3, b.field4
from table1 as a INNER JOIN table2 as b ON a.key1 = b.key1 AND a.key2 = b.key2
where b.field5 in (select field5 from table3)

ini tidak akan memberi saya baris dalam urutan yang sama seperti pada tabel3.

Saya akan membutuhkan sesuatu seperti ini untuk mempertahankan pesanan?

select a.key1, a.key2, a.field1, a.field2, d.field3, d.field4 from
table1 as a INNER JOIN
 (select b.key1, b.key2, b.field3, b.field4
  from table2 as b INNER JOIN table3 as c
  ON b.field5 = c.field5) as d
WHERE a.key1 = d.key1 AND a.key2 = d.key2

5
2018-04-21 11:21


asal


Jawaban:


Order adalah hanya ditawarkan dalam hasil akhir ketika Anda menggunakan order by ayat.

Jika Anda ingin "dalam urutan yang sama dengan table3" Anda harus menulis yang benar order by klausa untuk membuat ulang urutan yang Anda miliki di tabel3.

Gabung ini bebas untuk mengacak baris jika itu membuat semuanya berjalan lebih cepat.


8
2018-04-21 11:26



Anda perlu menambahkan klausa ORDER BY.

SELECT a.key1, a.key2, a.field1, a.field2, d.field3, d.field4 
FROM table1 as a INNER JOIN (select b.key1, b.key2, b.field3, b.field4 from table2 as b 
INNER JOIN table3 as c ON b.field5 = c.field5) as d 
WHERE a.key1 = d.key1 AND a.key2 = d.key2
ORDER BY c.field5;

EDIT:

Saya salah mengerti maksud awal Anda. Solusi saya mengurutkan pada "nilai" untuk field5, yang mungkin bukan urutan mereka diletakkan dalam tabel. Anda tidak dapat mengandalkan urutan fisik baris dalam tabel dan saya takut bahwa apa yang Anda coba lakukan bukanlah sesuatu yang harus Anda andalkan. Alasannya, saya tidak berpikir Anda bisa menjamin pesanan akan cocok dengan "urutan yang sama seperti table3" jika apa yang Anda setelah adalah perintah fisik kecuali meja itu berkerumun di field5.

Sebagai contoh, jika tabel itu berkerumun di field1 dan Anda menggunakan identitas atau kolom "pengurutan" untuk menyortir seperti yang disarankan orang lain, saya berharap jenis pada kolom identitas / pengurutan jauh berbeda dari urutan fisik baris dalam meja. Saya bukan ahli SQL Server dengan cara apa pun, tetapi banyak basis data memungkinkan gerakan baris juga, yang dapat mengubah "urutan" baris secara fisik disimpan tanpa mengubah nilai dalam kolom semacam Anda, sehingga melanggar aturan Anda lagi.

Saya tidak yakin mengapa Anda perlu ini dikembalikan dalam perintah ketat ini. Jika memungkinkan, saya akan menghilangkan kendala itu dan memungkinkan data diproses / ditangani dengan menyortir nilai kolom apakah itu field5 atau beberapa bidang lainnya.


2
2018-04-21 11:25



Anda tidak dapat bergantung pada urutan fisik baris dalam sebuah tabel. Untuk memastikan pesanan yang diberikan, tambahkan bidang pengurutan ke tabel3 Anda, dan ubah kueri Anda menjadi

select 
  a.key1, 
  a.key2, 
  a.field1, 
  a.field2, 
  b.field3, 
  b.field4 
from table1 as a 
INNER JOIN table2 as b ON a.key1 = b.key1 AND a.key2 = b.key2 
INNER JOIN table3 as c on b.field5 = c.field5
ORDER BY c.sort_field

1
2018-04-21 11:30



Jika Anda ingin memesan data output, seperti yang diperintahkan (dimasukkan) di table3, saya akan menyarankan, menambahkan kolom ke table3 rowid int identity(1,1). Ini menciptakan bidang autoincrement, yang akan meningkatkan nilainya untuk setiap baris baru yang disisipkan.

Kemudian Anda dapat memilih baris seperti yang dimasukkan ke dalam tabel itu sebagai memilih order by table3.rowid

Referensi dari MSDN - IDENTITY (Properti)


1
2018-04-21 11:37



Cobalah ini:

select a.key1, a.key2, a.field1, a.field2, b.field3, b.field4
from table1 as a 
    JOIN table2 as b ON a.key1 = b.key1 AND a.key2 = b.key2
    join (select field5, ROW_NUMBER() over (order by (select null)) Table3_Order from table3) c on b.field5 c.field5
order by c.Table3_Order

Table3_Order adalah orisinal (menurut saya, urutan fisik) dalam tabel3.


0
2018-06-10 10:32



Saya baru saja mengalami masalah yang sama dan menemukan solusi lain - Anda bisa buat tabel tempdengan kolom apa pun yang Anda perlukan (dimulai dengan field5). Memasukkan semua nilai "field5" dari table3 ke tabel temp Anda terlebih dahulu akan mengunci urutan yang Anda inginkan (urutan yang sama seperti pada tabel3). Kemudian Anda dapat memperbarui sisa kolom tabel temporer Anda dengan bergabung di field5 dll. Sesuatu seperti ini:

create table #tempTable(field5 varchar(200), key1 int, key2 int, field1 varchar(200), field2 varchar(200), field3 varchar(200), field4 varchar(200))
--insert field5 values (in order) into temp table's first column
insert into #tempTable
select field5,null,null,null,null,null,null from table3
--update all other columns in the temp table as needed by joining on field5 etc.
update temp
set key1 = b.key1,
    key2 = b.key2,
    field3 = b.field3,
    field4 = b.field4
from #tempTable temp
join table2 b on b.field5 = temp.field5
--add the final fields from table1 in the same way...
update temp
set field1 = a.field1,
    field2 = a.field2
from #tempTable temp
join table1 a on a.key1 = temp.key1

0
2018-06-27 23:42



Saya memiliki masalah ini dan saya memecahkannya menggunakan ROWNUM di Oracle:

select a.key1, a.key2, a.field1, a.field2, b.field3, b.field4 from 
(select rownum as to_order, key1, key2, field1, field2 from table1) as a
INNER JOIN table2 as b
ON a.key1 = b.key1 AND a.key2 = b.key2 where b.field5 in (select field5 from table3)
order by a.to_order;

0
2017-09-03 06:35