2009-12-15 93 views
0

我传递一个邮编列表到一个存储过程(比如说11111,11112,11113,11114,11115),邮政编码表只包含几行(比如11111,11112,11113),现在I想写一个查询返回表中不存在的邮政编码(11114和11115)SQL服务器查询帮助

任何人都可以请帮我写一个这样的查询吗?

在此先感谢。

+1

你如何将这个邮政编码列表传入你的存储过程? – 2009-12-15 17:04:17

+0

你想比较一个邮政编码列表到你在数据库中的列表,并最终得到一个不在你的数据库中的邮政编码列表? – jim 2009-12-15 17:11:41

回答

0

您已使用JOIN构建您的第一个查询。

现在,你需要一个RIGHT JOIN/WHERE,包括你的拉链列表中的所有项目,其对压缩表记者记录null

编辑:下面是一个简单

CREATE TABLE ZipCodesTable(Code int NOT NULL) 
CREATE TABLE ZipCodesList (Code int NOT NULL) 

INSERT INTO ZipCodesTable (Code) VALUES (11111) 
INSERT INTO ZipCodesTable (Code) VALUES (11112) 
INSERT INTO ZipCodesTable (Code) VALUES (11113) 

INSERT INTO ZipCodesList (Code) VALUES (11111) 
INSERT INTO ZipCodesList (Code) VALUES (11112) 
INSERT INTO ZipCodesList (Code) VALUES (11113) 
INSERT INTO ZipCodesList (Code) VALUES (11114) 
INSERT INTO ZipCodesList (Code) VALUES (11115) 

SELECT ZipCodesList.Code 
    FROM ZipCodesTable RIGHT 
    JOIN ZipCodesList 
    ON ZipCodesTable.Code = ZipCodesList.Code 
WHERE ZipCodesTable.Code IS NULL 
0

这文章使用CTE采取您的字符串的条目,转换为表,以便您可以包含在查询中:http://www.sqlservercentral.com/articles/CTE/67974/

+0

您需要在网站上注册才能查看该文章作为供参考。与权威对抗! – 2009-12-15 19:59:43

+0

我的不好。我认为这就像是。 – JeffO 2009-12-16 02:09:44

2

不知道您的确切实施,这个快速和二rty查询应该适应你正在尝试的内容。选择从您通过列表,它是不是在邮政编码的全表邮编:

SELECT ZipCode 
FROM PassedList 
WHERE ZipCode NOT IN (
    SELECT DISTINCT ZipCode 
    FROM ZipCodeTable 
) 
0

无需在SQL创建表的存储过程使用临时表。如果你需要以字符串的形式传入,使用这个。如果你有一个表值参数,你可以把它们作为表格传入。

CREATE PROCEDURE spCheckZip 
@Zips varchar(256) --space delimited list of zips 

AS 

IF OBJECT_ID('tempdb..#ZipCheck') IS NOT NULL 
    DROP TABLE #ZipCheck 
CREATE TABLE #ZipCheck (zipcode string) --Note string not int for zips with leading 0's. 

IF CharIndex(' ',@Zips) > 1 
BEGIN 

    Declare @StartPos as int 
    Declare @ZipCd As Varchar(16) 

    set @StartPos = 2 
    set @ZipCd = substring(@Zips,1,CharIndex(',',@Zips)) 
    WHILE @StartPos > 1 and @StartPos < Len(@Zips) 
    BEGIN 
     INSERT Into #ZipCheck (zipcode) 
     SELECT Substring(@ZipCd,1,len(@ZipCd)-1) 
     SET @StartPos = charindex(',',@Zips, @StartPos)+1 
     SET @ZipCd = substring(@Zips,@StartPos,CharIndex(',',@Zips)) 
    END 
END 

SELECT ZipCode 
FROM ZipCheck LEFT JOIN YourZipTable on ZipCheck.zipcode=YourZipTable.YourZipField 
WHERE YourZipTable.YourZipField IS NULL