Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Pengidentifikasi multi-bagian tidak dapat diikat

Anda mencampur gabungan implisit dengan gabungan eksplisit. Itu diperbolehkan, tetapi Anda harus mengetahui cara melakukannya dengan benar.

Masalahnya, gabungan eksplisit (yang diimplementasikan menggunakan JOIN kata kunci) lebih diutamakan daripada yang implisit (penggabungan 'koma', di mana kondisi penggabungan ditentukan dalam WHERE klausa).

Berikut ini garis besar kueri Anda:

SELECT
  …
FROM a, b LEFT JOIN dkcd ON …
WHERE …

Anda mungkin mengharapkannya berperilaku seperti ini:

SELECT
  …
FROM (a, b) LEFT JOIN dkcd ON …
WHERE …

yaitu, kombinasi tabel a dan b digabungkan dengan tabel dkcd . Faktanya, yang terjadi adalah

SELECT
  …
FROM a, (b LEFT JOIN dkcd ON …)
WHERE …

yaitu, seperti yang mungkin sudah Anda pahami, dkcd digabungkan secara khusus dengan b dan hanya b , kemudian hasil join digabungkan dengan a dan disaring lebih lanjut dengan WHERE ayat. Dalam hal ini, referensi apa pun ke a di ON klausa tidak valid, a tidak diketahui pada saat itu. Itulah sebabnya Anda mendapatkan pesan kesalahan.

Jika saya jadi Anda, saya mungkin akan mencoba menulis ulang kueri ini, dan salah satu solusi yang mungkin adalah:

SELECT DISTINCT
  a.maxa,
  b.mahuyen,
  a.tenxa,
  b.tenhuyen,
  ISNULL(dkcd.tong, 0) AS tongdkcd
FROM phuongxa a
  INNER JOIN quanhuyen b ON LEFT(a.maxa, 2) = b.mahuyen
  LEFT OUTER JOIN (
    SELECT
      maxa,
      COUNT(*) AS tong
    FROM khaosat
    WHERE CONVERT(datetime, ngaylap, 103) BETWEEN 'Sep 1 2011' AND 'Sep 5 2011'
    GROUP BY maxa
  ) AS dkcd ON dkcd.maxa = a.maxa
WHERE a.maxa <> '99'
ORDER BY a.maxa

Berikut tabel a dan b di-join dulu, baru hasilnya di-join ke dkcd . Pada dasarnya, ini adalah kueri yang sama dengan kueri Anda, hanya menggunakan sintaks yang berbeda untuk salah satu gabungan, yang membuat perbedaan besar:referensi a.maxa di dkcd kondisi bergabung sekarang benar-benar valid.

Seperti yang dicatat oleh @Aaron Bertrand dengan benar, Anda mungkin harus memenuhi syarat maxa dengan alias tertentu, mungkin a , di bagian ORDER BY klausa.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Hubungkan ke SQL Server melalui PDO menggunakan SQL Server Driver

  2. Mengapa IS NOT NULL mengembalikan nilai NULL untuk Varchar (maks) di SQL Server?

  3. Cara Mencadangkan Database SQL Server menggunakan T-SQL

  4. SQL Server mengonversi varbinary ke string

  5. Buat Fungsi Buatan Pengguna Skalar di SQL Server