2012-11-06 29 views
6

Hãy nói rằng tôi có một câu hỏi như thế này:đâu khoản trên tuyên bố subquery trong chọn

Select col1, 
      col2, 
      (select count(smthng) from table2) as 'records' 
    from table1 

Tôi muốn lọc nó được không null cho cột 'hồ sơ'.

Tôi không thể làm điều này:

  Select col1, 
       col2, 
       (select count(smthng) from table2) as 'records' 
      from table1 
     where records is not null 

Điều tốt nhất tôi đã đưa ra là viết resultset này cho một tham số Bảng giá trị gia tăng và có một truy vấn riêng về resultset đó. Bất kỳ ý tưởng?

+0

@RichardTheKiwi Truy vấn của bạn là hoàn hảo, nhưng tôi đã chỉnh sửa nó để làm ngắn hơn. Chọn X. * từ (Chọn col1, col2, (chọn ..... từ bảng 2) dưới dạng bản ghi từ bảng1) X trong đó các bản ghi không phải là rỗng; –

Trả lời

9

Chỉ cần di chuyển nó đến một truy vấn nguồn gốc. Bạn không thể sử dụng một cột được định nghĩa trong mệnh đề SELECT trong mệnh đề WHERE.

Select col1, col2, records 
from 
(
    Select col1, 
      col2, 
      (select ..... from table2) as records 
    from table1 
) X 
where records is not null; 
3

Bạn nên làm một số thay đổi nhỏ ở đó:

Trước hết, thêm mệnh đề TOP trên subquery để buộc các truy vấn trả lại chỉ có một kỷ lục của table2 đó. Truy vấn phụ như thế này bạn chỉ nên trả về giá trị vô hướng.

Thứ hai, truy vấn con chỉ có thể có một cột trong danh sách cột của nó, do đó, giá trị trả lại phải là một cột vô hướng.

Cuối cùng, bạn không thể lọc truy vấn con hoặc bất kỳ cột nào được thực hiện trong mệnh đề chọn. Vì vậy, đề xuất của tôi là sử dụng "join" s hoặc "exists".

Select col1, 
     col2 
     from table1 
     left outer join 
      table2 
     on table1.key = table2.key 
     where not table2.key is null 

Hoặc này:

Select col1, 
     col2 
     from table1 
     inner join 
      table2 
     on table1.key = table2.key 

Hoặc cái này:

Select col1, 
     col2 
     from table1 
     where exists (
      select * 
        from table2 
        where table2.key = table1.key 
        and not table2.somethingelse is null 
        -- or any other relevant conditions 
     ) 

Cheers

+0

Nó nói "hồ sơ tên cột không hợp lệ" trên mệnh đề Where – user194076

+0

Tôi xin lỗi thưa ngài. Xem lại bài đăng được cập nhật. Cảm ơn bạn. – Rikki

Các vấn đề liên quan