สามารถระบุได้เพียงนิพจน์เดียวในรายการที่เลือกเมื่อไม่ได้แนะนำเคียวรีย่อยด้วย EXISTS


178

ข้อความค้นหาของฉันเป็นดังนี้และมีแบบสอบถามย่อยอยู่ภายใน:

 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)

ข้อผิดพลาดที่ฉันได้รับคือ ...

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

เมื่อฉันเรียกใช้คิวรีย่อยเพียงอย่างเดียวมันจะกลับมาดีดังนั้นฉันสมมติว่ามีปัญหาบางอย่างกับเคียวรีหลัก?

คำตอบ:


231

คุณไม่สามารถส่งคืนคอลัมน์สองคอลัมน์ (หรือหลายคอลัมน์) ในแบบสอบถามย่อยของคุณเพื่อทำการเปรียบเทียบในWHERE A_ID IN (subquery)ข้อ - คอลัมน์ใดที่ควรเปรียบเทียบA_IDกับ แบบสอบถามย่อยของคุณเท่านั้นที่จะต้องกลับคอลัมน์หนึ่งที่จำเป็นสำหรับการเปรียบเทียบคอลัมน์ในด้านอื่น ๆ INของ ดังนั้นแบบสอบถามจะต้องมีรูปแบบ:

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

คุณต้องการเพิ่มการจัดเรียงเพื่อให้คุณสามารถเลือกจากแถวบนสุดได้ แต่คุณไม่จำเป็นต้องส่งคืน COUNT เป็นคอลัมน์เพื่อเรียงลำดับของคุณ การเรียงลำดับในส่วนORDERคำสั่งไม่ขึ้นอยู่กับคอลัมน์ที่ส่งคืนโดยแบบสอบถาม

ลองสิ่งนี้:

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

คุณควรส่งคืนคอลัมน์เดียวและแถวเดียวในแบบสอบถามโดยที่คุณกำหนดค่าที่ส่งคืนให้กับตัวแปร ตัวอย่าง:

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
มันไม่ได้ช่วยอะไรฉัน ทำให้ฉันมีข้อผิดพลาดเดียวกัน การระบุคอลัมน์แทนที่จะ*ช่วยฉัน
Mohammedsalim Shivani

11

มันบ่นเกี่ยวกับ

COUNT(DISTINCT dNum) AS ud 

ภายในแบบสอบถามย่อย สามารถส่งคืนได้เพียงหนึ่งคอลัมน์จากแบบสอบถามย่อยยกเว้นว่าคุณกำลังดำเนินการค้นหาที่มีอยู่ ฉันไม่แน่ใจว่าทำไมคุณต้องการนับในคอลัมน์เดียวกันสองครั้งเผินๆมันดูซ้ำซ้อนกับสิ่งที่คุณกำลังทำ แบบสอบถามย่อยที่นี่เป็นเพียงตัวกรองที่ไม่เหมือนกับการเข้าร่วม เช่นคุณใช้เพื่อ จำกัด ข้อมูลไม่ระบุคอลัมน์ที่จะรับกลับ


บางครั้งคุณสามารถเข้าร่วมกับผลลัพธ์ข้อความค้นหาและนั่นจะช่วยแก้ปัญหาได้!
JosephDoggie

5

นอกเหนือจากการตอบสนองที่ดีมากที่นี่คุณสามารถลองได้เช่นกันหากคุณต้องการใช้คิวรีย่อยตามที่เป็นอยู่

วิธีการ:

1) เลือกคอลัมน์ที่ต้องการ (เพียง 1) จากแบบสอบถามย่อยของคุณ

2) ใช้ตำแหน่งเพื่อแมปชื่อคอลัมน์

รหัส:

 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 
   )
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.