2026 – 2027 Eğitim Dönemi erken kayıt dönemi başladı. Birebir eğitim programlarımız 21 Eylül 2026 tarihinde başlıyor.
Berk Akademi
Ana Sayfa

SQL Ambiguous Column Name Hatası: Nedenleri ve Çözümü

sql-ambiguous-column-name-hatasi-cozumu
Bu yazıda neler var?
  1. Ambiguous Column Name Hatası Nedir?
  2. Hatalı JOIN Sorgusu Belirsizliği Nasıl Oluşturur?
  3. Tablo Alias’larıyla Sorguyu Daha Okunabilir Yazma
  4. Belirsiz Sütunları Sistematik Olarak Nasıl Teşhis Edersiniz?
  5. Düzeltilmiş Sorguyu Kontrol Etme ve Hatanın Tekrarını Önleme
  6. Sık Sorulan Sorular

SQL ambiguous column name hatası, JOIN ile birden fazla tabloyu birleştirdiğinizde aynı isimde sütunların bulunması ve sorguda bu sütunun hangi tabloya ait olduğunun belirtilmemesi nedeniyle oluşur. Çözüm, sütunları tablo adıyla veya tablo alias’ıyla açıkça nitelendirmektir.

Bu hata çoğunlukla SQL sözdiziminin tamamen yanlış olmasından değil, sütun referansının belirsiz kalmasından kaynaklanır. SQL motoru, örneğin name ifadesinin öğrencinin mi yoksa dersin mi adını temsil ettiğini güvenle belirleyemediğinde sorguyu çalıştırmaz.

Ambiguous Column Name Hatası Nedir?

Bir sorguda yalnızca tek tablo kullanılıyorsa name veya id gibi sütun adları genellikle yeterlidir. Ancak JOIN sonrasında sorgunun kapsamına birden fazla tablo girdiğinde aynı sütun adı birden fazla kez bulunabilir.

Örneğin bir öğrenci-ders sisteminde şu tabloların olduğunu düşünelim:

  • students.id ve students.name: öğrencinin kimliği ve adı
  • courses.id ve courses.name: dersin kimliği ve adı
  • student_courses.student_id ve student_courses.course_id: öğrenci ile ders arasındaki ilişki

Bu tablolar birleştirildiğinde hem students hem de courses tablosunda id ve name sütunları bulunur. Bu nedenle sorguda yalnızca name yazmak, hangi tablonun kastedildiğini açıklamaz. Sütun adı students.name veya courses.name biçiminde yazıldığında belirsizlik ortadan kalkar.

Kullanılan SQL motoruna göre hata mesajının tam metni ve hatanın sorguda gösterildiği konum değişebilir. Örneğin bazı motorlar belirsiz sütun adını doğrudan belirtirken bazıları hata konumunu veya hata kodunu ayrıca gösterebilir. Temel sorun değişmez: nitelendirilmemiş sütun referansı birden fazla olası tabloya karşılık gelmektedir. ([sqlite.org](https://www.sqlite.org/faq.html?utm_source=openai))

Hatalı JOIN Sorgusu Belirsizliği Nasıl Oluşturur?

Hatalı JOIN Sorgusu Belirsizliği Nasıl Oluşturur?

Aşağıdaki hatalı sorguda students ve courses tabloları, aralarındaki ilişkiyi tutan student_courses tablosu üzerinden birleştiriliyor. Fakat name sütununun hangi tablodan alınacağı belirtilmiyor:

SELECT name
FROM students
JOIN student_courses
  ON students.id = student_courses.student_id
JOIN courses
  ON courses.id = student_courses.course_id;

Bu sorguda hem students.name hem de courses.name mevcut olduğu için name ifadesi belirsizdir. SQL motoru bir öğrencinin adını mı, yoksa dersin adını mı istediğinizi tahmin etmez. Aynı durum şu koşul ifadesinde de ortaya çıkabilir:

SELECT students.name, courses.name
FROM students
JOIN student_courses
  ON students.id = student_courses.student_id
JOIN courses
  ON courses.id = student_courses.course_id
WHERE id = 1;

Buradaki id ifadesi de iki tabloda bulunduğu için belirsizdir. Öğrencinin kimliğine göre filtreleme yapılacaksa students.id, dersin kimliğine göre filtreleme yapılacaksa courses.id yazılmalıdır.

İlk ve en doğrudan çözüm, ortak sütunları tam tablo adlarıyla nitelendirmektir:

CREATE TABLE students (id INTEGER, name TEXT);
CREATE TABLE courses (id INTEGER, name TEXT);
CREATE TABLE student_courses (student_id INTEGER, course_id INTEGER);

INSERT INTO students VALUES (1, 'Ayşe'), (2, 'Mehmet');
INSERT INTO courses VALUES (10, 'Python'), (20, 'Java');
INSERT INTO student_courses VALUES (1, 10), (2, 20);

SELECT students.name AS student_name,
       courses.name AS course_name
FROM students
JOIN student_courses
  ON students.id = student_courses.student_id
JOIN courses
  ON courses.id = student_courses.course_id
ORDER BY students.name;

Sorgunun beklenen sonucu şöyledir:

student_name course_name
Ayşe Python
Mehmet Java

Burada students.name öğrenci adını, courses.name ise ders adını açıkça belirtir. AS ile verilen student_name ve course_name ifadeleri ise sonuç kümesinde görünen sütun başlıklarıdır; tablo alias’ı gibi tabloyu sorgu içinde temsil etmezler.

Tablo Alias’larıyla Sorguyu Daha Okunabilir Yazma

Tablo Alias’larıyla Sorguyu Daha Okunabilir Yazma

Tablo alias’ı, FROM veya JOIN sonrasında tabloya verilen geçici addır. Uzun tablo adlarını sorgu içinde tekrar tekrar yazmak yerine students tablosuna s, courses tablosuna c gibi kısa ve anlamlı adlar verilebilir. Böylece s.name ifadesi sütunun students tablosundan, c.name ifadesi ise courses tablosundan geldiğini açıkça gösterir.

Aşağıdaki sorguda name sütununun kaynağı belirtilmiştir. AS kullanımı okunabilirliği artırır; bazı SQL motorlarında tablo alias’ı tanımlarken AS yazmak isteğe bağlı olsa da tutarlı bir yazım biçimi tercih etmek hata ayıklamayı kolaylaştırır.

SELECT
    s.name AS student_name,
    c.name AS course_name
FROM students AS s
JOIN courses AS c
    ON c.student_id = s.id
ORDER BY s.name;

Beklenen çıktı, önceki bölümde tablo adları açıkça yazılarak elde edilen sonuçla aynıdır: Her satırda öğrencinin adı ve kayıtlı olduğu ders birlikte gösterilir. Değişen şey sonuç değil, sorgunun hangi tablodaki sütunu kullandığını daha net ifade etmesidir. SQL Server’da sütun alias’larının özellikle ORDER BY içindeki kullanımı için Microsoft Learn SELECT açıklamaları incelenebilir; farklı motorlarda kurallar değişebileceği için kullanılan veritabanının dokümantasyonu ayrıca kontrol edilmelidir.

Tablo alias’ı ile SELECT alias’ı aynı şey değildir

Tablo alias’ı, sütunun kaynağını belirtir. Örneğin s.name ifadesindeki s, öğrenciler tablosunu temsil eder. SELECT alias’ı ise sorgu sonucunda görünen sütuna okunabilir bir çıktı adı verir. s.name AS student_name yazıldığında student_name, sonuç kümesindeki başlıktır; yeni bir tablo veya sütun oluşturmaz.

SELECT alias’ının WHERE, ORDER BY ve GROUP BY bölümlerinde kullanılıp kullanılamayacağı SQL motoruna ve sorgunun bağlamına göre farklılaşabilir. Bu nedenle motor bağımsız kesin bir kural varsaymak yerine sorgunun çalıştığı sistemin alias kullanım kuralları kontrol edilmelidir. Özellikle WHERE içinde sonuç alias’ı yerine çoğu durumda kaynak sütunu veya aynı ifade yeniden yazılır.

Belirsiz Sütunları Sistematik Olarak Nasıl Teşhis Edersiniz?

Ambiguous Column Name hatasını çözmenin en güvenilir yolu, sorguyu rastgele değiştirmek yerine üç aşamalı bir akışla incelemektir. Öğrenci ve ders tablolarının her ikisinde de name sütunu bulunduğunu varsayalım.

  1. Tabloları ve JOIN bağlantılarını ayırın. Önce FROM ve JOIN bölümlerindeki tabloları listeleyin. Ardından ortak sütun adlarını bulun. Bu örnekte hem students hem de courses tablosunda name alanı vardır. student_id gibi bağlantı sütunlarının hangi tabloya ait olduğunu da belirleyin.
  2. Alias ve sütun nitelendirmelerini ekleyin. Tablolara s ve c alias’larını verin. Daha sonra ortak veya kritik sütunları s.name, c.name ve c.student_id biçiminde yazın. Böylece SQL motorunun seçim yapmasını beklemek yerine kaynağı siz belirtirsiniz.
  3. Sorgu bölümlerini sırayla tarayın. Önce SELECT, sonra WHERE, ardından ORDER BY ve GROUP BY ifadelerini kontrol edin. Nitelendirilmemiş ortak bir sütun bulduğunuz her yerde uygun tablo alias’ını ekleyin.

Örneğin ilk kontrol yalnızca SELECT bölümünde yapılabilir:

SELECT s.name, c.name
FROM students AS s
JOIN courses AS c ON c.student_id = s.id;

Ardından WHERE koşulunu inceleyin. name hangi tabloya aitse onu açıkça yazın:

WHERE s.name LIKE 'A%'

Sonraki adımda sıralama ifadesini kontrol edin:

ORDER BY s.name;

Gruplama kullanılan bir sorguda da aynı yaklaşımı sürdürün:

SELECT s.name, COUNT(c.id) AS course_count
FROM students AS s
JOIN courses AS c ON c.student_id = s.id
GROUP BY s.name
ORDER BY s.name;
SQL bölümü Kontrol edilecek nokta Önerilen düzeltme
SELECT Ortak sütun adı kaynaksız mı? s.name veya c.name yazın.
WHERE Filtrelenen sütun hangi tabloya ait? Koşulu tablo alias’ı ile nitelendirin.
ORDER BY Sıralama sütunu birden fazla tabloda var mı? ORDER BY s.name gibi açık kaynak kullanın.
GROUP BY Gruplama sütunu SELECT ifadesiyle uyumlu mu? Gerekirse aynı tablo alias’ını GROUP BY içinde de yazın.

Not: Nitelendirilmemiş sütunların GROUP BY ve ORDER BY içinde nasıl değerlendirildiği SQL motoruna ve sorgu bağlamına göre değişebilir. Bu nedenle kullanılan SQL motorunda ilgili davranış kontrol edilmelidir.

Düzeltilmiş Sorguyu Kontrol Etme ve Hatanın Tekrarını Önleme

Düzeltilmiş sorguda amaç, ortak sütun adlarını hangi tablonun sağladığını açıkça belirtmektir. Öğrenci ve ders bilgilerini birlikte listeleyen tamamlanmış sorgu şu şekilde yazılabilir:

SELECT
    s.name AS student_name,
    c.name AS course_name,
    sc.score
FROM students AS s
JOIN student_courses AS sc ON sc.student_id = s.id
JOIN courses AS c ON c.id = sc.course_id
ORDER BY s.name, c.name;

Burada s.name öğrenci tablosundaki adı, c.name ders tablosundaki adı, sc.score ise ilişki tablosundaki notu ifade eder. Her sütun referansı tek bir tabloya bağlandığı için SQL motorunun hangi name sütununu kullanacağı konusunda belirsizlik kalmaz.

student_name course_name score
Ayşe Java 88
Mehmet Python 92

AS student_name ve AS course_name ifadeleri sonuç kümesinde görünen sütun adlarını düzenler. Bunlar SELECT alias’ıdır; sorgunun başındaki s, c ve sc ise tablolara verilen alias’lardır. Tablo alias’ı sütunları nitelendirmek için, SELECT alias’ı ise çoğunlukla çıktıyı daha anlaşılır adlandırmak için kullanılır.

Hatanın tekrarını önlemek için kontrol listesi

  • JOIN’e eklenen her tabloyu ve bu tablonun sütun adlarını inceleyin.
  • İki veya daha fazla tabloda bulunan ortak sütunları işaretleyin. Özellikle id, name, status ve created_at gibi adlara dikkat edin.
  • SELECT, WHERE, ORDER BY ve GROUP BY bölümlerindeki sütun referanslarını sırayla tarayın.
  • Ortak sütunları tablo alias’ıyla yazın: s.name, c.name gibi.
  • SELECT alias’larını çıktı adını açıklamak için kullanın; onları tablo alias’ı gibi düşünmeyin.
  • Sorguyu önce yalnızca JOIN ile, ardından SELECT sütunlarını ve en son filtreleme veya sıralama ifadelerini ekleyerek parça parça çalıştırın.

Bu kontrolü alışkanlık hâline getirmek, sorgu büyüdükçe oluşan belirsizlikleri daha erken fark etmenizi sağlar. Hata mesajlarını ve temel SQL kavramlarını kendi seviyenizde karşılaştırarak pratik yapmak için ücretsiz yazılım bilgisi testi de kullanılabilir.

Sık Sorulan Sorular

Ambiguous column name hatası yalnızca SELECT bölümünde mi oluşur?

Hayır. Ortak bir sütun adı WHERE, ORDER BY veya GROUP BY içinde nitelendirilmeden kullanılırsa benzer bir belirsizlik oluşabilir. Bu nedenle yalnızca SELECT listesini değil, sorgunun tüm bölümlerini kontrol etmek gerekir.

Tablo alias’ı ile SELECT alias’ı arasındaki fark nedir?

Tablo alias’ı, sorgu içinde tabloyu kısa biçimde belirtir; örneğin students AS s. SELECT alias’ı ise sonuçta görünen sütuna yeni bir ad verir; örneğin s.name AS student_name.

JOIN sorgularında her sütunu mutlaka tablo alias’ıyla yazmak gerekir mi?

Her sütun için zorunlu olmayabilir. Ancak aynı ad birden fazla tabloda bulunuyorsa tablo alias’ı kullanılmalıdır. Tüm sütunları nitelendirmek, özellikle sorgu büyüdüğünde okunabilirliği ve hata ayıklamayı kolaylaştırır.

SQL motorları aynı belirsiz sütun sorgusu için farklı hata mesajları gösterebilir mi?

Evet. SQL motorları aynı belirsizliği farklı hata metinleriyle bildirebilir veya bazı sorgu bağlamlarında alias çözümleme kuralları farklı davranabilir. Bu nedenle hata mesajının yanında sorgudaki tablo ve sütun referanslarını da incelemek gerekir.

Belirsiz sütun hatasını çözmenin temel yolu, her sütunun kaynağını açıkça belirtmek ve sorguyu küçük parçalar hâlinde doğrulamaktır.

Bu içerik aradığın cevabı verdi mi?
Yanıtın, hangi yazıları geliştirmemiz gerektiğini anlamamıza yardımcı olur.
Bu içeriğin üretilmesinde yapay zeka araçlarından destek alınmıştır.

Bu konudan sonra ne okuyabilirsin?

Tüm yazılar

İlgili Eğitimler

Berk Keskin — Yazılım Geliştirici ve Eğitmen
Yazar

Berk Keskin Kimdir?

Yazılıma 12 yaşında başladı; bugün öğrencinin seviyesine ve hedefine göre şekillenen sürdürülebilir öğrenme sistemleri tasarlıyor. 500'den fazla kişiye ezber değil, düşünerek kod yazmayı öğretti — Berk Akademi'de izlemeye değil üretmeye dayalı öğrenme kültürünü o kuruyor.

WhatsApp Hemen Ara