不同的连接查询

时间:2011-09-27 15:20:05

标签: sql

可能是愚蠢的问题,但让我难过。比较2个表并仅返回不同的列。

        SELECT DISTINCT(DM.CLIENT_CODE) FROM DBO.DM_CLIENT DM
        LEFT JOIN DBO.STG_DM_CLIENT STG
        ON STG.CLIENT_CODE = DM.CLIENT_CODE

查询的目的是仅返回DM表中的新client_codes(或未在STG表中列出的client_codes)。

我认为这会起作用,但不会。

然后可以在案例查询中使用此查询来验证新代码何时存在,然后将结果集设置为“A”

       select  case 
            when (SELECT DBO.DM_CLIENT.Client_Code  
            FROM DBO.DM_CLIENT DM  
            LEFT JOIN DBO.STG_DM_CLIENT STG    
          ON STG.Client_Code= DM.Client_Code  
            WHERE STG.Client_Code IS NULL  
          GROUP BY  DM.Client_Code) then 'A'
       end

       from  DBO.DM_CLIENT.Client_Code, DBO.STG_DM_CLIENT.Client_Code

如何将该陈述作为条件陈述?

6 个答案:

答案 0 :(得分:1)

听起来你想要从ST中返回那些在STG中不存在的那些。

 SELECT DM.Client_Code
 FROM DBO.DM_CLIENT As DM
 LEFT JOIN DBO.STG_DM_CLIENT As STG 
   ON STG.Client_Code= DM.Client_Code
 WHERE STG.Client_Code IS NULL
 GROUP BY  DM.Client_Code;

答案 1 :(得分:0)

您需要更改查询以排除连接失败的记录。

SELECT
    DISTINCT(DM.CLIENT_CODE)
FROM
    DBO.DM_CLIENT AS DM
    LEFT OUTER JOIN DBO.STG_DM_CLIENT AS STG ON
        STG.CLIENT_CODE = DM.CLIENT_CODE
WHERE
    STG.CLIENT_CODE IS NULL

答案 2 :(得分:0)

该查询实际上是返回所有client_codes。

试试这个。

 SELECT DISTINCT(DM.CLIENT_CODE) FROM DBO.DM_CLIENT DM
     WHERE NOT EXISTS (
        SELECT * FROM DBO.STG_DM_CLIENT STG
        WHERE STG.CLIENT_CODE = DM.CLIENT_CODE
     );

提出的查询mikerobi在效率上要优于此。

答案 3 :(得分:0)

尝试:

select distinct dm.client_code
from dbo.dm_client dm
left join dbo.stg_dm_client stg on stg.client_code = dm.client_code
where stg.client_code is null

或者:

select distinct dm.client_code
from dbo.dm_client dm
where not exists (select null from stg.client_code stg where dm.client_code = stg.client_code)

答案 4 :(得分:0)

SELECT CLIENT_CODE
  FROM DBO.DM_CLIENT
EXCEPT
SELECT CLIENT_CODE
  FROM DBO.STG_DM_CLIENT;

如果您使用的是Oracle,请将EXCEPT更改为MINUS

答案 5 :(得分:0)

您可以通过不同方式执行此操作:

使用NOT IN

SELECT *
FROM DM_CLIENT
WHERE client_code NOT IN (
    SELECT client_code
    FROM STG_DM_CLIENT 
)

使用EXISTS

SELECT *
FROM DM_CLIENT dm
WHERE NOT EXISTS (
    SELECT client_code
    FROM STG_DM_CLIENT
    WHERE client_code=dm.client_code
)

使用LEFT或RIGHT JOIN

SELECT dm.* 
FROM DM_CLIENT DM
LEFT JOIN STG_DM_CLIENT STG
     ON STG.CLIENT_CODE = DM.CLIENT_CODE
WHERE stg.client_code is null

在SQL Server 2005或更高版本中,您可以使用OUTER APPLYEXCEPT