Chỉ một biểu thức có thể được chỉ định trong danh sách chọn khi truy vấn con không được giới thiệu với EXISTS


176

Truy vấn của tôi như sau và chứa một truy vấn con trong đó:

 select count(distinct dNum)
 from myDB.dbo.AQ
 where A_ID in 
  (SELECT DISTINCT TOP (0.1) PERCENT A_ID, 
            COUNT(DISTINCT dNum) AS ud 
 FROM         myDB.dbo.AQ
 WHERE     M > 1 and B = 0 
 GROUP BY A_ID ORDER BY ud DESC)

Lỗi tôi nhận được là ...

Only one expression can be specified in the select list when the subquery is not
introduced with EXISTS.`

Khi tôi chạy truy vấn phụ một mình, nó sẽ trả về tốt, vì vậy tôi giả sử có một số vấn đề với truy vấn chính?

Câu trả lời:


230

Bạn không thể trả về hai (hoặc nhiều) cột trong truy vấn con của mình để thực hiện so sánh trong WHERE A_ID IN (subquery)mệnh đề - cột nào được cho là so sánh A_IDvới? Truy vấn con của bạn chỉ phải trả về một cột cần thiết để so sánh với cột ở phía bên kia của IN. Vì vậy, truy vấn cần phải có dạng:

SELECT * From ThisTable WHERE ThisColumn IN (SELECT ThatColumn FROM ThatTable)

Bạn cũng muốn thêm sắp xếp để bạn có thể chọn chỉ từ các hàng trên cùng, nhưng bạn không cần phải trả về COUNT dưới dạng cột để thực hiện sắp xếp; sắp xếp trong ORDERmệnh đề độc lập với các cột được truy vấn trả về.

Hãy thử một cái gì đó như thế này:

select count(distinct dNum) 
from myDB.dbo.AQ 
where A_ID in
    (SELECT DISTINCT TOP (0.1) PERCENT A_ID
    FROM myDB.dbo.AQ 
    WHERE M > 1 and B = 0
    GROUP BY A_ID 
    ORDER BY COUNT(DISTINCT dNum) DESC)

83

Bạn chỉ nên trả về một cột và một hàng trong truy vấn nơi bạn gán giá trị được trả về cho một biến. Thí dụ:

select * from table1 where Date in (select * from Dates) -- Wrong
select * from table1 where Date in (select Column1,Column2 from Dates) -- Wrong
select * from table1 where Date in (select Column1 from Dates) -- OK

2
Nó không giúp tôi. Cho tôi cùng một lỗi. Chỉ định cột thay vì *giúp tôi.
Mohammedsalim Shivani

11

Nó đang phàn nàn về

COUNT(DISTINCT dNum) AS ud 

bên trong truy vấn phụ. Chỉ một cột có thể được trả về từ truy vấn con trừ khi bạn đang thực hiện một truy vấn tồn tại. Tôi không chắc tại sao bạn muốn thực hiện đếm trên cùng một cột hai lần, nhìn bề ngoài nó có vẻ dư thừa với những gì bạn đang làm. Truy vấn con ở đây chỉ là một bộ lọc, nó không giống như tham gia. tức là bạn sử dụng nó để hạn chế dữ liệu, không chỉ định cột nào cần lấy lại.


Đôi khi, bạn có thể tham gia chống lại kết quả truy vấn và điều đó sẽ giải quyết vấn đề!
JosephDoggie

5

Ngoài các phản hồi rất tốt ở đây, bạn cũng có thể thử điều này nếu bạn muốn sử dụng truy vấn phụ của mình.

Tiếp cận:

1) Chọn cột mong muốn (Chỉ 1) từ truy vấn phụ của bạn

2) Sử dụng vị trí để ánh xạ tên cột

Mã số:

 SELECT count(distinct dNum)
 FROM myDB.dbo.AQ
 WHERE A_ID in 
   (
    SELECT A_ID 
    FROM (SELECT DISTINCT TOP (0.1) PERCENT A_ID, COUNT(DISTINCT dNum) AS ud 
          FROM         myDB.dbo.AQ
          WHERE     M > 1 and B = 0 
          GROUP BY A_ID ORDER BY ud DESC
         ) a 
   )
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.