2012-07-13 3 views
-1

이 쿼리를 수정하여 데이터가 반환되지 않을 때 하나 또는 모든 행에 '0'이 인쇄 된 행을 반환하려고합니다. ISNULL()을 사용하여 시도했지만 어디에도 없습니다.null 인 경우

SELECT DISTINCT 
SA.DELETED, 
PAT.VERSION, 
PAT.PATTERNDATE, 
SA.AGENT_VERSION, 
SCL.COMPUTER_NAME AS Computer_Name, 
SCO.OPERATION_SYSTEM AS Operation_System, 
dateadd(s,convert(bigint,SA.CREATION_TIME)/1000, 
'01-01-1970 00:00:00') CREATION_DTTM, 
dateadd(s,convert(bigint,SA.LAST_UPDATE_TIME)/1000, 
'01-01-1970 00:00:00') Lastupdatetime, 
DATEADD(s, convert(bigint,LAST_SCAN_TIME)/1000, 
'01-01-1970 00:00:00')LAST_SCAN_TIME, 
PAT.PATTERNDATE AS Pattern_Date, 
SCL.USER_NAME AS User_Name, 
VSC.IP_ADDR1_TEXT AS IP_Add, 
IM.NAME AS Group_Name 

FROM ((((SEM_AGENT SA 

INNER JOIN SEM_CLIENT SCL 
ON ((SA.COMPUTER_ID=SCL.COMPUTER_ID) 
AND (SA.DOMAIN_ID=SCL.DOMAIN_ID)) 
AND (SA.GROUP_ID=SCL.GROUP_ID)) 

INNER JOIN SEM_COMPUTER SCO 
ON ((SA.COMPUTER_ID=SCO.COMPUTER_ID) 
AND (SA.DOMAIN_ID=SCO.DOMAIN_ID)) 
AND (SA.DELETED=SCO.DELETED)) 

INNER JOIN PATTERN PAT 
ON SA.PATTERN_IDX=PAT.PATTERN_IDX) 
INNER JOIN IDENTITY_MAP IM 
ON SCL.GROUP_ID=IM.ID) 

INNER JOIN V_SEM_COMPUTER VSC 
ON SCO.COMPUTER_ID=VSC.COMPUTER_ID 
AND SA.DELETED=0 

WHERE PAT.Patterndate < (SELECT MAX(Patterndate) -2 FROM Pattern) 
AND SCO.OPERATION_SYSTEM NOT LIKE '%2000%' 
ORDER BY Computer_Name 
+6

당신이 당신의 예와 동일한 기능을 약간 작은 예제를 제공 할 수 있을까요? – Misch

+6

이것은 읽기가 매우 어렵습니다. – deefour

+0

어떤 RDBMS를 사용하고 있습니까? –

답변

0

나는 당신의 조건에 모든 행이 있는지 확인하고, 그렇지 않으면 0을 선택, 그렇지 않으면 전체 쿼리를 선택합니다 :

SELECT TOP 1 * 
FROM (((("SEM_AGENT" "SEM_AGENT" INNER JOIN "SEM_CLIENT" "SEM_CLIENT" 
    ON (("SEM_AGENT"."COMPUTER_ID"="SEM_CLIENT"."COMPUTER_ID") 
    AND ("SEM_AGENT"."DOMAIN_ID"="SEM_CLIENT"."DOMAIN_ID")) 
    AND ("SEM_AGENT"."GROUP_ID"="SEM_CLIENT"."GROUP_ID")) INNER JOIN "SEM_COMPUTER" "SEM_COMPUTER" 
    ON (("SEM_AGENT"."COMPUTER_ID"="SEM_COMPUTER"."COMPUTER_ID") 
    AND ("SEM_AGENT"."DOMAIN_ID"="SEM_COMPUTER"."DOMAIN_ID")) 
    AND ("SEM_AGENT"."DELETED"="SEM_COMPUTER"."DELETED")) INNER JOIN "PATTERN" "PATTERN" 
    ON "SEM_AGENT"."PATTERN_IDX"="PATTERN"."PATTERN_IDX") INNER JOIN "IDENTITY_MAP" "IDENTITY_MAP" 
    ON "SEM_CLIENT"."GROUP_ID"="IDENTITY_MAP"."ID") INNER JOIN "V_SEM_COMPUTER" "V_SEM_COMPUTER" 
    ON "SEM_COMPUTER"."COMPUTER_ID"="V_SEM_COMPUTER"."COMPUTER_ID" 
    AND "SEM_AGENT"."DELETED"=0 
WHERE Pattern.Patterndate < (select max(Patterndate) -2 from Pattern) 
AND SEM_COMPUTER.OPERATION_SYSTEM NOT LIKE '%2000%' 

IF @@ROWCOUNT = 0 
    SELECT 0 
ELSE 
BEGIN 
    SELECT DISTINCT "SEM_AGENT"."DELETED" 
     ,"PATTERN"."VERSION" 
     ,"PATTERN"."PATTERNDATE" 
     ,"SEM_AGENT"."AGENT_VERSION" 
     ,"SEM_CLIENT"."COMPUTER_NAME" "Computer Name" 
     , "SEM_COMPUTER"."OPERATION_SYSTEM" "Operation System" 
     ,dateadd(s,convert(bigint,"SEM_AGENT"."CREATION_TIME")/1000,'01-01-1970 00:00:00')  
     CREATION_DTTM 
     , dateadd(s,convert(bigint,"SEM_AGENT"."LAST_UPDATE_TIME")/1000,'01-01-1970 00:00:00') Lastupdatetime 
     , DATEADD(s, convert(bigint,LAST_SCAN_TIME)/1000, '01-01-1970 00:00:00')"Last Scan Time" 
     , "PATTERN"."PATTERNDATE" "Pattern Date" 
     , "SEM_CLIENT"."USER_NAME" "User Name" 
     , "V_SEM_COMPUTER"."IP_ADDR1_TEXT" "IP Address" 
     , "IDENTITY_MAP"."NAME" "Group Name" 
    FROM (((("SEM_AGENT" "SEM_AGENT" INNER JOIN "SEM_CLIENT" "SEM_CLIENT" 
     ON (("SEM_AGENT"."COMPUTER_ID"="SEM_CLIENT"."COMPUTER_ID") 
     AND ("SEM_AGENT"."DOMAIN_ID"="SEM_CLIENT"."DOMAIN_ID")) 
     AND ("SEM_AGENT"."GROUP_ID"="SEM_CLIENT"."GROUP_ID")) INNER JOIN "SEM_COMPUTER" "SEM_COMPUTER" 
     ON (("SEM_AGENT"."COMPUTER_ID"="SEM_COMPUTER"."COMPUTER_ID") 
     AND ("SEM_AGENT"."DOMAIN_ID"="SEM_COMPUTER"."DOMAIN_ID")) 
     AND ("SEM_AGENT"."DELETED"="SEM_COMPUTER"."DELETED")) INNER JOIN "PATTERN" "PATTERN" 
     ON "SEM_AGENT"."PATTERN_IDX"="PATTERN"."PATTERN_IDX") INNER JOIN "IDENTITY_MAP" "IDENTITY_MAP" 
     ON "SEM_CLIENT"."GROUP_ID"="IDENTITY_MAP"."ID") INNER JOIN "V_SEM_COMPUTER" "V_SEM_COMPUTER" 
     ON "SEM_COMPUTER"."COMPUTER_ID"="V_SEM_COMPUTER"."COMPUTER_ID" 
     AND "SEM_AGENT"."DELETED"=0 
    WHERE Pattern.Patterndate < (select max(Patterndate) -2 from Pattern) 
    AND SEM_COMPUTER.OPERATION_SYSTEM NOT LIKE '%2000%' 
    ORDER BY "Computer Name" 
END 

당신이 알고있는 경우 변경되지 않습니다 조인 내부 결과의 수를 줄이면 효율성을 위해 첫 번째 쿼리에서이를 제거 할 수 있습니다. 당신이 @@ ROWCOUNT를 사용하지 않은 경우

, 당신은 또한) (COUNT를 사용할 수 있습니다

DECLARE @count INT 

SELECT @count = COUNT(*) 
FROM (
SELECT TOP 1 * 
FROM (((("SEM_AGENT" "SEM_AGENT" INNER JOIN "SEM_CLIENT" "SEM_CLIENT" 
    ON (("SEM_AGENT"."COMPUTER_ID"="SEM_CLIENT"."COMPUTER_ID") 
    AND ("SEM_AGENT"."DOMAIN_ID"="SEM_CLIENT"."DOMAIN_ID")) 
    AND ("SEM_AGENT"."GROUP_ID"="SEM_CLIENT"."GROUP_ID")) INNER JOIN "SEM_COMPUTER" "SEM_COMPUTER" 
    ON (("SEM_AGENT"."COMPUTER_ID"="SEM_COMPUTER"."COMPUTER_ID") 
    AND ("SEM_AGENT"."DOMAIN_ID"="SEM_COMPUTER"."DOMAIN_ID")) 
    AND ("SEM_AGENT"."DELETED"="SEM_COMPUTER"."DELETED")) INNER JOIN "PATTERN" "PATTERN" 
    ON "SEM_AGENT"."PATTERN_IDX"="PATTERN"."PATTERN_IDX") INNER JOIN "IDENTITY_MAP" "IDENTITY_MAP" 
    ON "SEM_CLIENT"."GROUP_ID"="IDENTITY_MAP"."ID") INNER JOIN "V_SEM_COMPUTER" "V_SEM_COMPUTER" 
    ON "SEM_COMPUTER"."COMPUTER_ID"="V_SEM_COMPUTER"."COMPUTER_ID" 
    AND "SEM_AGENT"."DELETED"=0 
WHERE Pattern.Patterndate < (select max(Patterndate) -2 from Pattern) 
AND SEM_COMPUTER.OPERATION_SYSTEM NOT LIKE '%2000%') temp 

IF @count = 0 
SELECT 0 
ELSE 
BEGIN 
    SELECT DISTINCT "SEM_AGENT"."DELETED" 
     ,"PATTERN"."VERSION" 
     ,"PATTERN"."PATTERNDATE" 
     ,"SEM_AGENT"."AGENT_VERSION" 
     ,"SEM_CLIENT"."COMPUTER_NAME" "Computer Name" 
     , "SEM_COMPUTER"."OPERATION_SYSTEM" "Operation System" 
     ,dateadd(s,convert(bigint,"SEM_AGENT"."CREATION_TIME")/1000,'01-01-1970 00:00:00')  
     CREATION_DTTM 
     , dateadd(s,convert(bigint,"SEM_AGENT"."LAST_UPDATE_TIME")/1000,'01-01-1970 00:00:00') Lastupdatetime 
     , DATEADD(s, convert(bigint,LAST_SCAN_TIME)/1000, '01-01-1970 00:00:00')"Last Scan Time" 
     , "PATTERN"."PATTERNDATE" "Pattern Date" 
     , "SEM_CLIENT"."USER_NAME" "User Name" 
     , "V_SEM_COMPUTER"."IP_ADDR1_TEXT" "IP Address" 
     , "IDENTITY_MAP"."NAME" "Group Name" 
    FROM (((("SEM_AGENT" "SEM_AGENT" INNER JOIN "SEM_CLIENT" "SEM_CLIENT" 
     ON (("SEM_AGENT"."COMPUTER_ID"="SEM_CLIENT"."COMPUTER_ID") 
     AND ("SEM_AGENT"."DOMAIN_ID"="SEM_CLIENT"."DOMAIN_ID")) 
     AND ("SEM_AGENT"."GROUP_ID"="SEM_CLIENT"."GROUP_ID")) INNER JOIN "SEM_COMPUTER" "SEM_COMPUTER" 
     ON (("SEM_AGENT"."COMPUTER_ID"="SEM_COMPUTER"."COMPUTER_ID") 
     AND ("SEM_AGENT"."DOMAIN_ID"="SEM_COMPUTER"."DOMAIN_ID")) 
     AND ("SEM_AGENT"."DELETED"="SEM_COMPUTER"."DELETED")) INNER JOIN "PATTERN" "PATTERN" 
     ON "SEM_AGENT"."PATTERN_IDX"="PATTERN"."PATTERN_IDX") INNER JOIN "IDENTITY_MAP" "IDENTITY_MAP" 
     ON "SEM_CLIENT"."GROUP_ID"="IDENTITY_MAP"."ID") INNER JOIN "V_SEM_COMPUTER" "V_SEM_COMPUTER" 
     ON "SEM_COMPUTER"."COMPUTER_ID"="V_SEM_COMPUTER"."COMPUTER_ID" 
     AND "SEM_AGENT"."DELETED"=0 
    WHERE Pattern.Patterndate < (select max(Patterndate) -2 from Pattern) 
    AND SEM_COMPUTER.OPERATION_SYSTEM NOT LIKE '%2000%' 
    ORDER BY "Computer Name" 
END 
+0

이것은 " 'DOMAIN_ID'열이 'temp'에 대해 여러 번 지정되었습니다. ' – Ben

+0

그 이유는 select *와 동일한 이름의 컬럼 테이블을 사용했기 때문입니다. 별표를 특정 컬럼으로 변경했거나 테이블 식별자로 모든 컬럼을 구체적으로 나열했기 때문입니다. – Erica

0

당신은 0 개 이상의 행을 반환하는 쿼리가 있습니다. 0 행을 반환하면 다른 행을 포함하고자합니다.

이렇게하면 쿼리에 계산상의 복잡성이 추가됩니다. 행할 수있는 한 가지 방법은 원하는 행과 함께 행의 출처를 나타내는 플래그를 결합하는 것입니다. 또한 단지 조합 역에서 FromQ로 함께 그룹, 순서 및이를 무시 할 수

select * 
from (select t.*, sum(FromQ) over (partition by NULL) as numQ 
     from (select *, 1 as FromQ 
      from <query> 
      union all 
      select 0,0,0,0 . . . , 0 as FromQ 
      ) t 
    ) t 
where numQ = 0 or numQ > 0 and FromQ <> 0 

: 절은 마지막 행을 필터링하는 경우 그런 다음 모든 행 사이에 정보를 공유 할 창 기능을 사용하고를 사용 첫 번째가 아닌 경우 응용 프로그램의 행.

3
레코드가 NOT으로 기본값의
  • 노조와 CTE에서 CTE
  • SELECT에서 SQL을 넣어

    • 에 없을 때 NULL 행을 반환하는 한 가지 방법은 당신에 대해 EXISTS

      CTE.


  • WITH CTE AS (
        SELECT "Computer Name". ... 
    ) 
    SELECT * FROM CTE 
    UNION ALL 
    SELECT '', 0, 0, '' 
    WHERE 
        NOT EXISTS(SELECT * FROM CTE) 
    ORDER BY 
        "Computer Name" 
    

    DEMO returns "null" recordDEMO returns data를 참조하십시오.
    두 데모의 차이가 나는 세 문장으로 파산 CTE

    +0

    "ORDER BY 절이 TOP이나 FOR XML이 지정되지 않으면 뷰, 인라인 함수, 파생 테이블, 하위 쿼리 및 공통 테이블 식에서 유효하지 않습니다." – Ben

    +1

    @Ben CTE에서 UNION 후에 주문을 이동하면됩니다. 업데이트 –

    +0

    을 참조하십시오. 감사합니다.이 업데이트를 시도했지만 여전히 동일한 오류가 발생합니다. 등의 CTE와 함께 '( 를 선택) CTE UNION ALL SELECT'FROM SELECT * : – Ben

    0

    에서 Where 1=2Where 1=1입니다 :

    DECLARE @RecordCount int; 
    
    WITH Temp_CTE 
    AS 
    (
    SELECT DISTINCT EM_AGENT.DELETED 
        ,PATTERN.VERSION 
        ,PATTERN.PATTERNDATE 
        ,SEM_AGENT.AGENT_VERSION 
        ,SEM_CLIENT.COMPUTER_NAME "Computer Name" 
        ,SEM_COMPUTER.OPERATION_SYSTEM "Operation System" 
        ,dateadd(s,convert(bigint,SEM_AGENT.CREATION_TIME)/1000 
        ,'01-01-1970 00:00:00') CREATION_DTTM 
        , dateadd(s,convert(bigint,SEM_AGENT.LAST_UPDATE_TIME)/1000 
        ,'01-01-1970 00:00:00') Lastupdatetime 
        , DATEADD(s, convert(bigint,LAST_SCAN_TIME)/1000 
        , '01-01-1970 00:00:00') "Last Scan Time" 
        , PATTERN.PATTERNDATE "Pattern Date" 
        , SEM_CLIENT.USER_NAME "User Name" 
        , V_SEM_COMPUTER.IP_ADDR1_TEXT "IP Address" 
        , IDENTITY_MAP.NAME "Group Name" 
    FROM (((("SEM_AGENT" "SEM_AGENT" 
    INNER JOIN "SEM_CLIENT" "SEM_CLIENT" 
        ON (("SEM_AGENT"."COMPUTER_ID"="SEM_CLIENT"."COMPUTER_ID") 
        AND ("SEM_AGENT"."DOMAIN_ID"="SEM_CLIENT"."DOMAIN_ID")) 
        AND ("SEM_AGENT"."GROUP_ID"="SEM_CLIENT"."GROUP_ID")) 
    INNER JOIN "SEM_COMPUTER" "SEM_COMPUTER" 
        ON (("SEM_AGENT"."COMPUTER_ID"="SEM_COMPUTER"."COMPUTER_ID") 
        AND ("SEM_AGENT"."DOMAIN_ID"="SEM_COMPUTER"."DOMAIN_ID")) 
        AND ("SEM_AGENT"."DELETED"="SEM_COMPUTER"."DELETED")) 
    INNER JOIN "PATTERN" "PATTERN" 
        ON "SEM_AGENT"."PATTERN_IDX"="PATTERN"."PATTERN_IDX") 
    INNER JOIN "IDENTITY_MAP" "IDENTITY_MAP" 
        ON "SEM_CLIENT"."GROUP_ID"="IDENTITY_MAP"."ID") 
    INNER JOIN "V_SEM_COMPUTER" "V_SEM_COMPUTER" 
        ON "SEM_COMPUTER"."COMPUTER_ID"="V_SEM_COMPUTER"."COMPUTER_ID" 
        AND "SEM_AGENT"."DELETED"=0 
    WHERE Pattern.Patterndate < (select max(Patterndate) -2 from Pattern) 
        AND SEM_COMPUTER.OPERATION_SYSTEM NOT LIKE '%2000%' 
    ) 
    SELECT @RecordCount = COUNT(*) FROM Temp_CTE; 
    
    IF @RecordCount=0 THEN 
        SELECT 0 
    ELSE 
        SELECT * FROM Temp_CTE ORDER BY [Computer Name]; 
    
    +0

    "DOMAIN_ID '컬럼도 반환했습니다. 'temp'에 대해 여러 번 지정되었습니다. " – Ben

    +0

    @Ben Hmmm. DOMANIN_ID이 (가) 반환되지 않았습니다. 그러나, 나는 WITH WITH Temp_CTE 필드 선택에서 쉼표를 놓친 것을 보았다. 나는 그것을 해결하기 위해 내 대답을 수정. –