Saya baru dalam SQL. Akan membutuhkan kalian memberi saya beberapa panduan. Saya telah bergabung dengan 2 tabel untuk mendapatkan informasi wadah dan ingin bergabung dengan tabel lain untuk mendapatkan tanggal. Berikut kode untuk bergabung pertama.

Select a.ConsolNumber, a.ConsolType,a.ConsolTransport,b.Container_20F,b.Container_20R,b.Container_20H, b.Container_40F,b.DeliveryMode
FROM ConsolHeader a 
LEFT Join Containers b on a.Consolnumber = b.Consolnumber

Untuk join kedua, berikut ini adalah trickle part dimana beberapa consolnumber memiliki sedikit transit.

Sebagai contoh

|ConsolNumber| ETD     |
|------------|---------|
|C00713392   |  null   |
|C00713392   | 1/1/2021|
|C00713392   | 2/1/2021|

Saya ingin mendapatkan tanggal paling awal (1/1/2021) tetapi tidak nol. Berikut adalah kode yang saya coba, Hasilnya, tidak ada tanggal ETD nol yang diambil tetapi beberapa Consolnumber kembali dengan tanggal terbaru. (2/1/2021)

Select a.ConsolNumber, a.ConsolType,a.ConsolTransport,b.Container_20F,b.Container_20R,b.Container_20H, b.Container_40F,b.DeliveryMode,c.Min(c.ETD)
FROM ConsolHeader a 
LEFT Join Containers b on a.Consolnumber = b.Consolnumber
INNER Join ConsolLegs c on a.Consolnumber = c.ConsolNumber
WHERE c.ETD is not null
GROUP BY a.ConsolNumber, a.ConsolType,a.ConsolTransport,b.Container_20F,b.Container_20R,b.Container_20H, b.Container_40F,b.DeliveryMode

Lebih dari itu, saya memiliki lebih dari 100 ribu baris data, mohon sarankan kueri yang akan berjalan lebih efisien.

Hargai dan terima kasih atas bantuan yang diberikan!

sql
0
Nick 15 Januari 2021, 12:01

3 jawaban

Jawaban Terbaik

Subquery yang berkorelasi adalah metode sederhana:

SELECT ch.ConsolNumber, ch.ConsolType, ch.ConsolTransport, ch.Container_20F,
       c.Container_20R, c.Container_20H,  c.Container_40F, c.DeliveryMode,
       (SELECT MIN(cl.ETD)
        FROM ConsolLegs cl
        WHERE cl.Consolnumber = ch.Consolnumber
       ) as min_ETD
FROM ConsolHeader ch LEFT JOIN
     Containers c
     ON c.Consolnumber = ch.Consolnumber;

Catatan:

  • MIN() secara otomatis mengabaikan NULL.
  • Alias ​​tabel yang bermakna membuat kueri lebih mudah untuk ditulis dan dibaca.
  • Ini menghindari GROUP BY luar, yang biasanya merupakan kemenangan kinerja.
  • Di sebagian besar basis data, Anda menginginkan indeks pada ConsoleLegs(Consolnumber, ETD) untuk kinerja.
0
Gordon Linoff 15 Januari 2021, 12:12

Anda dapat menggunakan NOT EXISTS sebagai berikut:

Select a.ConsolNumber, a.ConsolType, 
       a.ConsolTransport, b.Container_20F, 
       b.Container_20R, b.Container_20H, 
       b.Container_40F, b.DeliveryMode, 
       c.ETD
  FROM ConsolHeader a 
  LEFT Join Containers b on a.Consolnumber = b.Consolnumber
 INNER Join ConsolLegs c on a.Consolnumber = c.ConsolNumber
 WHERE c.ETD is not null
  AND not exists
      (select 1 from ConsolLegs cc where c.Consolnumber = cc.Consolnumber
          and cc.etd < c.etd)
0
Popeye 15 Januari 2021, 09:16

Anda bisa mendapatkan min ETD terlebih dahulu:

SELECT MIN(CL.ETD) FROM ConsolLegs CL

Kemudian dapatkan hasil:

Select a.ConsolNumber, a.ConsolType, 
       a.ConsolTransport, b.Container_20F, 
       b.Container_20R, b.Container_20H, 
       b.Container_40F, b.DeliveryMode, 
       c.ETD
  FROM ConsolHeader a 
  LEFT Join Containers b on a.Consolnumber = b.Consolnumber
 INNER Join ConsolLegs c on a.Consolnumber = c.ConsolNumber
   AND c.ETD = (SELECT MIN(CL.ETD) FROM ConsolLegs CL)

Jika kueri lambat, coba tambahkan indeks di ConsolLegs.ETD

0
FLYFLU 15 Januari 2021, 09:33