从EXCEPT结果中选择单列

时间:2011-03-10 16:51:12

标签: sql sql-server sql-server-2008

我只想从这个EXCEPT语句的结果中得到ItemID:

SELECT     ManufacturerID, ItemID, ItemName, Description, Notes, Dimensions, BasePrice, SpecialPrice, OrderMinimumQuantity, OrderMultipleQuantity, 
                      OnHandQuantity, Category, IntroDate, BackOrderDate, UPC, PriceLevel1, PriceLevel2, PriceLevel3, PriceLevel4, PriceLevel5, PriceLevel6, PriceLevel7, PriceLevel8, 
                      PriceLevel9, PieceBox, Cubes, UnitOfMeasure, UDF1, UDF2, UDF3, UDF4, UDF5, AdditionalImageCount, PhotoName, AppendProductModifiers, Discontinued, 
                      IsDeleted
FROM         StagingProducts
WHERE     (ManufacturerID = 10)
EXCEPT 
SELECT     ManufacturerID, ItemID, ItemName, Description, Notes, Dimensions, BasePrice, SpecialPrice, OrderMinimumQuantity, OrderMultipleQuantity, 
                      OnHandQuantity, Category, IntroDate, BackOrderDate, UPC, PriceLevel1, PriceLevel2, PriceLevel3, PriceLevel4, PriceLevel5, PriceLevel6, PriceLevel7, PriceLevel8, 
                      PriceLevel9, PieceBox, Cubes, UnitOfMeasure, UDF1, UDF2, UDF3, UDF4, UDF5, AdditionalImageCount, PhotoName, AppendProductModifiers, Discontinued, 
                      IsDeleted
FROM         Products
WHERE     (ManufacturerID = 10)

如果我可以保存EXCEPT语句的结果以便在INSERT INTO查询中使用,那将是非常好的。

基本上我将根据ItemID从Products表中的EXCEPT语句返回来删除记录,然后插入新记录,这些记录是同一个EXCEPT语句的结果 - 旧的输入带有新的。

更新 - 工作解决方案:

    DECLARE @T TABLE (
    [ManufacturerID] [int] NOT NULL,
    [ItemID] [nvarchar](50) NULL,
    [ItemName] [nvarchar](100) NOT NULL,
    [Description] [nvarchar](max) NULL,
    [Notes] [nvarchar](200) NULL,
    [Dimensions] [nvarchar](50) NULL,
    [BasePrice] [money] NOT NULL,
    [SpecialPrice] [money] NULL,
    [OrderMinimumQuantity] [int] NOT NULL,
    [OrderMultipleQuantity] [int] NOT NULL,
    [OnHandQuantity] [int] NULL,
    [Category] [nvarchar](100) NULL,
    [IntroDate] [date] NULL,
    [BackOrderDate] [date] NULL,
    [UPC] [nvarchar](25) NULL,
    [PriceLevel1] [decimal](18, 0) NULL,
    [PriceLevel2] [decimal](18, 0) NULL,
    [PriceLevel3] [decimal](18, 0) NULL,
    [PriceLevel4] [decimal](18, 0) NULL,
    [PriceLevel5] [decimal](18, 0) NULL,
    [PriceLevel6] [decimal](18, 0) NULL,
    [PriceLevel7] [decimal](18, 0) NULL,
    [PriceLevel8] [decimal](18, 0) NULL,
    [PriceLevel9] [decimal](18, 0) NULL,
    [PieceBox] [int] NULL,
    [Cubes] [decimal](18, 0) NULL,
    [UnitOfMeasure] [nvarchar](10) NULL,
    [UDF1] [nvarchar](50) NULL,
    [UDF2] [nvarchar](50) NULL,
    [UDF3] [nvarchar](50) NULL,
    [UDF4] [nvarchar](50) NULL,
    [UDF5] [nvarchar](50) NULL,
    [AdditionalImageCount] [smallint] NULL,
    [PhotoName] [nvarchar](50) NULL,
    [AppendProductModifiers] [bit] NULL,
    [Discontinued] [bit] NULL,
    [IsDeleted] [bit] NOT NULL)

;WITH T As
(SELECT     ManufacturerID, ItemID, ItemName, Description, Notes, Dimensions, BasePrice, SpecialPrice, OrderMinimumQuantity, OrderMultipleQuantity, 
                      OnHandQuantity, Category, IntroDate, BackOrderDate, UPC, PriceLevel1, PriceLevel2, PriceLevel3, PriceLevel4, PriceLevel5, PriceLevel6, PriceLevel7, PriceLevel8, 
                      PriceLevel9, PieceBox, Cubes, UnitOfMeasure, UDF1, UDF2, UDF3, UDF4, UDF5, AdditionalImageCount, PhotoName, AppendProductModifiers, Discontinued, 
                      IsDeleted
FROM         StagingProducts
WHERE     (ManufacturerID = @ManufacturerID)
EXCEPT 
SELECT     ManufacturerID, ItemID, ItemName, Description, Notes, Dimensions, BasePrice, SpecialPrice, OrderMinimumQuantity, OrderMultipleQuantity, 
                      OnHandQuantity, Category, IntroDate, BackOrderDate, UPC, PriceLevel1, PriceLevel2, PriceLevel3, PriceLevel4, PriceLevel5, PriceLevel6, PriceLevel7, PriceLevel8, 
                      PriceLevel9, PieceBox, Cubes, UnitOfMeasure, UDF1, UDF2, UDF3, UDF4, UDF5, AdditionalImageCount, PhotoName, AppendProductModifiers, Discontinued, 
                      IsDeleted
FROM         Products
WHERE     (ManufacturerID = @ManufacturerID)
)
INSERT INTO  @T
SELECT * 
FROM T

    -- Kill the old products
    Delete FROM Products where ManufacturerID = @ManufacturerID
        AND ItemID IN(SELECT ItemID FROM @T)

    -- insert the new products  
    INSERT INTO Products ([ManufacturerID]
           ,[ItemID]
           ,[ItemName]
           ,[Description]
           ,[Notes]
           ,[Dimensions]
           ,[BasePrice]
           ,[SpecialPrice]
           ,[OrderMinimumQuantity]
           ,[OrderMultipleQuantity]
           ,[OnHandQuantity]
           ,[Category]
           ,[IntroDate]
           ,[BackOrderDate]
           ,[UPC]
           ,[PriceLevel1]
           ,[PriceLevel2]
           ,[PriceLevel3]
           ,[PriceLevel4]
           ,[PriceLevel5]
           ,[PriceLevel6]
           ,[PriceLevel7]
           ,[PriceLevel8]
           ,[PriceLevel9]
           ,[PieceBox]
           ,[Cubes]
           ,[UnitOfMeasure]
           ,[UDF1]
           ,[UDF2]
           ,[UDF3]
           ,[UDF4]
           ,[UDF5]
           ,[AdditionalImageCount]
           ,[PhotoName]
           ,[AppendProductModifiers]
           ,[Discontinued]
           ,[CreatedOn]
           ,[CreatedBy]
           ,[ModifiedOn]
           ,[ModifiedBy]
           ,[DeletedOn]
           ,[DeletedBy]
           ,[IsDeleted])
    SELECT [ManufacturerID]
      ,[ItemID]
      ,[ItemName]
      ,[Description]
      ,[Notes]
      ,[Dimensions]
      ,[BasePrice]
      ,[SpecialPrice]
      ,[OrderMinimumQuantity]
      ,[OrderMultipleQuantity]
      ,[OnHandQuantity]
      ,[Category]
      ,[IntroDate]
      ,[BackOrderDate]
      ,[UPC]
      ,[PriceLevel1]
      ,[PriceLevel2]
      ,[PriceLevel3]
      ,[PriceLevel4]
      ,[PriceLevel5]
      ,[PriceLevel6]
      ,[PriceLevel7]
      ,[PriceLevel8]
      ,[PriceLevel9]
      ,[PieceBox]
      ,[Cubes]
      ,[UnitOfMeasure]
      ,[UDF1]
      ,[UDF2]
      ,[UDF3]
      ,[UDF4]
      ,[UDF5]
      ,[AdditionalImageCount]
      ,[PhotoName]
      ,[AppendProductModifiers]
      ,[Discontinued]
      ,[CreatedOn]
      ,[CreatedBy]
      ,[ModifiedOn]
      ,[ModifiedBy]
      ,[DeletedOn]
      ,[DeletedBy]
      ,[IsDeleted] from StagingProducts
      Where ManufacturerID = @ManufacturerID
      AND ItemID IN(SELECT ItemID FROM @T)

3 个答案:

答案 0 :(得分:2)

当您使用SQL Server 2008时,您可能需要查看MERGE以了解同步需求,但要回答您可以执行的问题

DECLARE @T TABLE (ItemID INT PRIMARY KEY)

;WITH T As
(
Your Big Statement
)
INSERT INTO  @T
SELECT ItemID 
FROM T

答案 1 :(得分:1)

单独谈到Martin关于使用MERGE的答案......

您可以使用NOT EXISTS,它提供相同的查询计划并且更具可读性。

SELECT     ManufacturerID, ItemID, ItemName, Description, Notes, Dimensions, BasePrice, SpecialPrice, OrderMinimumQuantity, OrderMultipleQuantity, 
                      OnHandQuantity, Category, IntroDate, BackOrderDate, UPC, PriceLevel1, PriceLevel2, PriceLevel3, PriceLevel4, PriceLevel5, PriceLevel6, PriceLevel7, PriceLevel8, 
                      PriceLevel9, PieceBox, Cubes, UnitOfMeasure, UDF1, UDF2, UDF3, UDF4, UDF5, AdditionalImageCount, PhotoName, AppendProductModifiers, Discontinued, 
                      IsDeleted
FROM         StagingProducts SG
WHERE
     (ManufacturerID = @ManufacturerID)

NOT EXISTS (SELECT * FROM
         Products P
       WHERE
          P.Key1 = SG.Key1 AND SG.Key2 = SG.Key2 AND SG.Key3 = SG.Key3)

答案 2 :(得分:1)

忘记CTE和表变量:只需使用MERGE

CTE只是做WHEN [NOT] MATCH MERGE部分所做的事情。

您已经有一个临时表(StagingProducts),因此您不需要@T

MERGE看起来像这样(我用...缩短了列列表):

MERGE INTO Products
USING StagingProducts
   ON Products.ManufacturerID = StagingProducts.ManufacturerID
      AND Products.ItemID = StagingProducts.ItemID
      AND Products.ManufacturerID = @ManufacturerID
WHEN MATCHED THEN
   UPDATE 
      SET ItemName = StagingProducts.ItemName, 
          Description = StagingProducts.Description, 
          Notes = StagingProducts.Notes, 
          ...
          IsDeleted = StagingProducts.IsDeleted 
WHEN NOT MATCHED THEN
   INSERT (ManufacturerID, ItemID, ItemName, Description, Notes, ..., IsDeleted)
      VALUES (ManufacturerID, ItemID, ItemName, Description, Notes, ..., IsDeleted);