Lấy tên bảng từ truy vấn công đoàn?


8

Đây là truy vấn của tôi

SELECT Id, productName, Largeimagepath, Discount, Price, Image FROM tablename1 where Active =1 
union 
SELECT Id, productName, Largeimagepath, Discount, Price, Image FROM tablename2 where Active =1
union  
SELECT Id, productName, Largeimagepath, Discount, Price, Image FROM tablename3 where Active =1

Nó đang hoạt động đúng.

Bây giờ tôi muốn lấy tên bảng cho tương ứng productNametrong tương lai.

  1. Vì vậy, làm thế nào tôi có thể lấy nó?

Tôi đã thử AS.. như thế này:

SELECT Id, productName, Largeimagepath, Discount, Price, Image
FROM tablename3 AS tablename
where Active = 1;

nhưng không nhận được đầu ra.

  1. Làm cách nào để sửa câu hỏi và cải thiện hiệu năng của truy vấn?

1
Chỉ cần thêm một số định danh CHỌN ... blah, 'tablename' TỪ t1 và cứ thế
Mihai

Câu trả lời:


20

Thông thường khi sử dụng UNIONvà bạn cần biết một hàng cụ thể đến từ bảng nào, bạn sẽ sử dụng một giá trị được mã hóa cứng được lưu trữ trong một cột tương tự như:

SELECT Id, productName, Largeimagepath, Discount, Price, Image, 'Tablename1' as Source
FROM tablename1 
where Active =1 
union 
SELECT Id, productName, Largeimagepath, Discount, Price, Image, 'Tablename2' as Source
FROM tablename2 
where Active =1
union  
SELECT Id, productName, Largeimagepath, Discount, Price, Image, 'Tablename3' as Source
FROM tablename3 
where Active =1;

Điều này sẽ trả về một cột mới được gọi Sourcevới một mã định danh cho biết hàng đến từ bảng nào.

Như @ypercube đã đề xuất trong các nhận xét, bạn cũng có thể muốn xem xét thay đổi điều này thành một UNION ALL- điều này sẽ bao gồm trùng lặp nhưng bạn cũng sẽ có một định danh trên đó xuất phát từ bảng nào. Sử dụng một UNION ALLsẽ loại bỏ tác động hiệu suất của việc loại bỏ dups.

SELECT Id, productName, Largeimagepath, Discount, Price, Image, 'Tablename1' as Source
FROM tablename1 
where Active =1 
union all
SELECT Id, productName, Largeimagepath, Discount, Price, Image, 'Tablename2' as Source
FROM tablename2 
where Active =1
union all
SELECT Id, productName, Largeimagepath, Discount, Price, Image, 'Tablename3' as Source
FROM tablename3 
where Active =1;

@bluefeet: Làm thế nào tôi có thể cải thiện hiệu suất của truy vấn?
Prashant Tapase

@Prashant Tôi đoán một phần vấn đề của bạn là với UNION, hãy xem bản chỉnh sửa của tôi bằng UNION ALL. UNION sẽ loại bỏ các bản sao nhưng nó dẫn đến chi phí bổ sung.
Taryn

3

Bạn có thể thử điều này với UNION ALL

vì có lẽ bạn cũng cần nhập trùng lặp vì sẽ thêm tên bảng, nó sẽ là duy nhất và hiệu suất cũng sẽ được cải thiện

CHỌN Id, tên sản phẩm, Largeimagepath, Giảm giá, Giá, Hình ảnh, 'Tablename1' dưới dạng Tên bảng
TỪ tablename1 
trong đó hoạt động = 1 
ĐOÀN TẤT CẢ
CHỌN Id, tên sản phẩm, Largeimagepath, Giảm giá, Giá, Hình ảnh, 'Tablename2' dưới dạng Tên bảng
TỪ tablename2 
trong đó hoạt động = 1
ĐOÀN TẤT CẢ
CHỌN Id, tên sản phẩm, Largeimagepath, Giảm giá, Giá, Hình ảnh, 'Tablename3' dưới dạng Tên bảng
TỪ tablename3 
trong đó Hoạt động = 1;

0

truy vấn bên dưới hoạt động tốt hơn và cung cấp cho bạn ý tưởng tốt hơn vì các truy vấn trên không hiển thị hàng hai lần.

SELECT t1.*,t1.table_name
FROM
t1
UNION ALL
SELECT t2.*,t2.table_name
FROM
t2
LEFT OUTER JOIN 
t1
ON t1.id=t2.id
WHERE t1.id=null

đoạn script trên không cung cấp các hàng dữ liệu trùng lặp và đảm bảo

  1. Tất cả dữ liệu phổ biến bteween t1 và t2 như bảng t1 nguồn.
  2. Nguồn không t2 hàng như bảng t1.
  3. Nguồn hàng t1 không phải là bảng t2.

nếu bạn muốn dữ liệu chung từ bảng t2, hãy lật sang trái

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.