Jika kueri yang digabungkan sangat berbeda, bidang output harus menggabungkan data dari tipe yang berbeda. Jika demikian, kueri gabungan seringkali hanya mengembalikan hasil sebagai tipe data teks karena tipe data tersebut dapat berisi teks dan angka. Untuk memahami cara kerjanya, kami akan menggunakan kueri gabungan Transaksi Produk dalam contoh database Northwind. Buka contoh database, lalu buka kueri Transaksi Produk dalam tampilan lembar data. Sepuluh data terakhir seharusnya mirip dengan output ini:
Anggap saja Anda ingin bidang Jumlah dipisahkan menjadi dua, yaitu Beli dan Jual. Anda juga ingin mengisi nilai nol tetap untuk bidang tanpa nilai. Berikut tampilan SQL untuk kueri gabungan ini: SELECT [Product ID], [Order Date], [Company Name], [Transaction], 0 As Buy, [Quantity] As Sell FROM [Product Orders] UNION SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity] As Buy, 0 As Sell FROM [Product Purchases] ORDER BY [Order Date] DESC;Jika beralih ke tampilan lembar data, Anda akan melihat sepuluh data terakhir ditampilkan seperti berikut:
Masih dengan contoh ini, bagaimana jika Anda ingin bidang dengan nilai nol menjadi kosong? Anda dapat mengubah SQL agar tidak menampilkan apa pun sebagai ganti nilai nol dengan menambahkan kata kunci Null seperti berikut: SELECT [Product ID], [Order Date], [Company Name], [Transaction], Null As Buy, [Quantity] As Sell FROM [Product Orders] UNION SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity] As Buy, Null As Sell FROM [Product Purchases] ORDER BY [Order Date] DESC;Namun, seperti yang dapat dilihat jika beralih ke tampilan lembar data, kini Anda memiliki hasil yang tidak terduga. Dalam kolom Beli, setiap bidang kosong:
Hal ini terjadi karena Access menentukan tipe data bidang dari kueri pertama. Dalam contoh ini, Null bukanlah angka. Oleh karena itu, apa yang terjadi jika Anda mencoba dan menyisipkan string kosong untuk nilai bidang yang kosong? SQL untuk percobaan ini dapat terlihat seperti ini: SELECT [Product ID], [Order Date], [Company Name], [Transaction], "" As Buy, [Quantity] As Sell FROM [Product Orders] UNION SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity] As Buy, "" As Sell FROM [Product Purchases] ORDER BY [Order Date] DESC;Saat Anda beralih ke tampilan lembar data, Anda akan melihat bahwa Access mengambil nilai beli, namun ia mengonversinya menjadi teks. Anda bisa mengatakan ini adalah nilai teks karena rata kiri dalam tampilan lembar data. String kosong dalam kueri pertama bukan angka yang menyebabkan Anda melihat hasil ini. Anda juga akan melihat bahwa nilai jual juga dikonversi menjadi teks karena catatan pembelian berisi string kosong.
Lalu, bagaimana cara memecahkan teka-teki ini? Solusinya adalah memaksa kueri untuk menganggap nilai bidang menjadi angka. Hal ini dapat dilakukan dengan ekspresi: IIf(False, 0, Null)Syarat untuk diperiksa, False, tidak akan menjadi True, maka ekspresi tersebut akan selalu mengembalikan Null, tetapi Access masih mengevaluasi kedua opsi output dan menentukan output menjadi angka atau Null. Berikut cara menggunakan ekspresi ini dalam contoh yang dapat dimodifikasi: SELECT [Product ID], [Order Date], [Company Name], [Transaction], IIf(False, 0, Null) As Buy, [Quantity] As Sell FROM [Product Orders] UNION SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity] As Buy, Null As Sell FROM [Product Purchases] ORDER BY [Order Date] DESC;Perlu diingat bahwa mengubah kueri kedua tidak harus dilakukan. Jika beralih ke tampilan lembar data, Anda akan melihat hasil yang diinginkan:
Metode alternatif untuk mendapatkan hasil yang sama adalah menambahkan kueri dalam kueri gabungan dengan kueri lainnya pada bagian awal: SELECT 0 As [Product ID], Date() As [Order Date], "" As [Company Name], "" As [Transaction], 0 As Buy, 0 As Sell FROM [Product Orders] WHERE FalseUntuk setiap bidang, Access mengembalikan nilai tetap dari tipe data yang ditentukan. Tentu saja, Anda tidak ingin output kueri ini mengganggu hasilnya, sehingga Anda perlu menyertakan klausul WHERE ke False: WHERE FalseIni trik sederhana karena selalu bersifat false dan kueri tidak mengembalikan apa pun. Gabungkan pernyataan ini dengan SQL yang ada dan pernyataan lengkap telah berhasil dibuat, yaitu: SELECT 0 As [Product ID], Date() As [Order Date], "" As [Company Name], "" As [Transaction], 0 As Buy, 0 As Sell FROM [Product Orders] WHERE False UNION SELECT [Product ID], [Order Date], [Company Name], [Transaction], Null As Buy, [Quantity] As Sell FROM [Product Orders] UNION SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity] As Buy, Null As Sell FROM [Product Purchases] ORDER BY [Order Date] DESC;
Catatan: Kueri yang digabungkan dalam contoh ini yang menggunakan database Northwind mengembalikan 100 data, sementara dua kueri individu mengembalikan 58 dan 43 data untuk total data sebanyak 101. Perbedaan ini terjadi karena dua catatan tidak bersifat unik. Lihat bagian Bekerja dengan data yang berbeda dalam kueri gabungan menggunakan UNION ALL untuk mempelajari cara mengatasi skenario ini dengan menggunakan UNION ALL. |