2009-12-15 96 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