在不使用union的情况下显示表中不存在的where子句的元素

时间:2016-01-11 12:38:16

标签: sql union where

select * from tblCustomer where CustomerName in ('A','B','C','Y','Z')

假设客户A,B& C存在于tblCustomer中。

所以,我想在SQL中输出Y,Z。客户在不使用union子句的情况下命名tblCustomer中不存在的那些。

1 个答案:

答案 0 :(得分:0)

对于SQL Server,您可以使用2008版中引入的表值构造函数。

select n as CustomerName from (values('A'), ('B'), ('C'), ('Y'),('Z')) a(n)
left join tblCustomer c
 on a.n = c.customerName
 where c.customerName is null

查询返回:

CustomerName
-------
    Y
    Z

修改 您始终可以使用返回表值的函数。

CREATE FUNCTION [dbo].[ListToTable]( @ValueList varchar( 2000 ) )
 RETURNS @ValuesTable TABLE ( Value varchar(80) )
AS
BEGIN

DECLARE
    @ValueSeparator varchar(1),
    @ValueSeparatorIndex int

SET @ValueSeparator = ',';

SET @ValueList = LTRIM( @ValueList )

SET @ValueSeparatorIndex = CHARINDEX ( @ValueSeparator, @ValueList );

WHILE @ValueSeparatorIndex > 0 
BEGIN
    INSERT INTO @ValuesTable( Value ) VALUES(  SUBSTRING( @ValueList, 1, @ValueSeparatorIndex - 1 ) );

    SET @ValueList  = LTRIM( SUBSTRING( @ValueList , @ValueSeparatorIndex + 1, LEN(@ValueList ) - @ValueSeparatorIndex ) );

    SET @ValueSeparatorIndex = CHARINDEX ( @ValueSeparator, @ValueList );
END

IF LEN(@ValueList) > 0 
    INSERT INTO @ValuesTable( Value ) VALUES( @ValueList  );

RETURN
END

之后你可以用以下方式使用它:

select A.Value as CustomerName from ListToTable('A,B,C,X,Y') A
left join tblCustomer c
 on a.Value = c.customerName
 where c.customerName is null