SQL server查询帮助

时间:2009-12-15 17:01:36

标签: sql-server sql-server-2005

我将一个zipcodes列表传递给存储过程(例如11111,11112,11111,11111,11151),邮政编码表只包含几行(比如11111,11112,11131),现在我想写一个返回表中不存在的邮政编码的查询(11114和11115)

有人可以帮我写这样的查询吗?

提前致谢。

4 个答案:

答案 0 :(得分:2)

不知道您的确切实现,这个快速而肮脏的查询应该适应您正在尝试的内容。从您输入的列表中选择不在邮政编码完整表格中的邮政编码:

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

答案 1 :(得分: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

答案 2 :(得分:0)

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

答案 3 :(得分: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