Nếu bạn gặp lỗi đọc nội dung như “ ERROR 1054 (42S22):Cột không xác định‘ tab.ColName ’trong‘ trên mệnh đề ” ”Trong MariaDB, đây là ba nguyên nhân có thể xảy ra:
- Cột này không tồn tại.
- Bạn đang cố gắng tham chiếu đến một cột bí danh theo tên cột của nó.
- Hoặc có thể là theo cách khác. Bạn có thể đang tham chiếu cột với một bí danh chưa từng được khai báo.
Nếu một cột có bí danh, thì bạn phải sử dụng bí danh đó khi tham chiếu nó trong bất kỳ ON
nào mệnh đề khi thực hiện một phép nối với hai hoặc nhiều bảng. Ngược lại, nếu bạn tham chiếu một cột bằng bí danh, thì bạn cần đảm bảo rằng bí danh đó thực sự được khai báo ngay từ đầu.
Ví dụ 1
Dưới đây là một ví dụ về mã tạo ra lỗi:
SELECT
c.CatId,
c.CatName
FROM Cats c
INNER JOIN Dogs d
ON c.DogName = d.DogName;
Kết quả:
ERROR 1054 (42S22): Unknown column 'c.DogName' in 'on clause'
Ở đây tôi đã vô tình sử dụng c.DogName
trong ON
khi tôi định sử dụng c.CatName
.
Trong trường hợp này, cách khắc phục rất đơn giản. Sử dụng đúng tên cột:
SELECT
c.CatId,
c.CatName
FROM Cats c
INNER JOIN Dogs d
ON c.CatName = d.DogName;
Ví dụ 2
Dưới đây là một ví dụ khác về mã tạo ra lỗi:
SELECT
CatId,
CatName
FROM Cats
INNER JOIN Dogs d
ON c.CatName = d.DogName;
Kết quả:
ERROR 1054 (42S22): Unknown column 'c.CatName' in 'on clause'
Ở đây tôi đã tham chiếu đến một bí danh không tồn tại trong ON
mệnh đề. Tôi đã sử dụng c.CatName
để tham khảo CatName
trong cột Cats
bàn. Vấn đề duy nhất là Cats
bảng không có bí danh.
Để khắc phục sự cố này, tất cả những gì chúng tôi phải làm là cung cấp bí danh cho Cats
bảng:
SELECT
CatId,
CatName
FROM Cats c
INNER JOIN Dogs d
ON c.CatName = d.DogName;
Ngoài ra, chúng tôi có thể xóa tất cả các tham chiếu đến bí danh và chỉ sử dụng tên bảng đầy đủ:
SELECT
CatId,
CatName
FROM Cats
INNER JOIN Dogs
ON Cats.CatName = Dogs.DogName;
Một điều tôi nên chỉ ra là, trong ví dụ này, chúng tôi không đặt tiền tố tên cột trong SELECT
danh sách với bí danh. Nếu chúng tôi đã làm điều đó, chúng tôi sẽ gặp lỗi tương tự, nhưng với một thông báo hơi khác:
SELECT
c.CatId,
c.CatName
FROM Cats
INNER JOIN Dogs d
ON c.CatName = d.DogName;
Kết quả:
ERROR 1054 (42S22): Unknown column 'c.CatId' in 'field list'
Trong trường hợp này, nó đã phát hiện các cột không xác định trong danh sách trường trước khi tìm thấy cột trong ON
mệnh đề. Dù bằng cách nào thì giải pháp cũng giống nhau.
Ví dụ 3
Dưới đây là một ví dụ khác về mã tạo ra lỗi:
SELECT
c.CatId,
c.CatName
FROM Cats c
INNER JOIN Dogs d
ON Cats.CatName = d.DogName;
Kết quả:
ERROR 1054 (42S22): Unknown column 'Cats.CatName' in 'on clause'
Trong trường hợp này, một bí danh đã được khai báo cho Cats
nhưng tôi không sử dụng bí danh đó trong ON
mệnh đề.
Giải pháp ở đây là sử dụng bí danh thay vì tên bảng:
SELECT
c.CatId,
c.CatName
FROM Cats c
INNER JOIN Dogs d
ON c.CatName = d.DogName;