programing

하위 쿼리가 EXISTS에 도입되지 않은 경우 선택 목록에서 식을 하나만 지정할 수 있습니다.

mbctv 2023. 4. 6. 22:56
반응형

하위 쿼리가 EXISTS에 도입되지 않은 경우 선택 목록에서 식을 하나만 지정할 수 있습니다.

내 쿼리는 다음과 같으며 그 안에 하위 쿼리가 포함되어 있습니다.

 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)

내가 받고 있는 오류는...

서브쿼리가 EXISTS에 도입되지 않은 경우 선택 목록에서 지정할 수 있는 식은 1개뿐입니다.`

서브쿼리를 단독으로 실행하면 정상적으로 반환되기 때문에 메인쿼리에 문제가 있다고 생각됩니다.

하위 쿼리에서 두 개(또는 여러 개)의 열을 반환하여 에서 비교할 수 없습니다.WHERE A_ID IN (subquery)절 - 비교할 컬럼A_ID대상? 서브쿼리는 다른 쪽 컬럼과의 비교에 필요한1개의 컬럼만 반환해야 합니다.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)

반환된 값을 변수에 할당하는 쿼리에서는 1개의 열과1개의 행만 반환해야 합니다.예:

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

에 대해 불평하고 있다.

COUNT(DISTINCT dNum) AS ud 

서브쿼리 안에 있습니다.기존 쿼리를 수행하지 않는 한 하위 쿼리에서 열 하나만 반환할 수 있습니다.왜 같은 컬럼을 두 번 세고 싶은지 모르겠습니다.피상적으로는 당신이 하고 있는 일에 중복되어 보입니다.여기서의 하위 쿼리는 필터일 뿐 조인과는 다릅니다. 즉, 데이터를 제한하는 데 사용되며 되돌릴 열을 지정하는 데 사용되지 않습니다.

여기서의 매우 좋은 응답 외에도, 하위 쿼리를 그대로 사용하려면 이 옵션을 사용할 수도 있습니다.

어프로치:

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 
   )

누군가에게 도움이 될 경우를 대비해서, 이 에러의 원인은 다음과 같습니다.json을 반환하는 절차가 필요했는데 for json path를 생략했습니다.

set @jsonout = (SELECT ID, SumLev, Census_GEOID, AreaName, Worksite 
            from CS_GEO G (nolock) 
                join @allids a on g.ID = a.[value] 
            where g.Worksite = @worksite)

저장 프로시저를 저장하려고 했을 때 오류가 발생했습니다.절차 끝에 json 경로를 코드에 추가하여 수정했습니다.

set @jsonout = (SELECT ID, SumLev, Census_GEOID, AreaName, Worksite 
            from CS_GEO G (nolock) 
                join @allids a on g.ID = a.[value] 
            where g.Worksite = @worksite for json path)

서브쿼리의 투영에는

SELECT t.col1,t.col2
FROM table1 t 
WHERE EXISTS (SELECT st.col1,st.col2 
               FROM table2 st
               WHERE st.fcol = t.fcol)

언급URL : https://stackoverflow.com/questions/1904314/only-one-expression-can-be-specified-in-the-select-list-when-the-subquery-is-not

반응형