开发者

select single column from EXCEPT result

开发者 https://www.devze.com 2023-02-16 05:23 出处:网络
I just want the ItemID from the result of this EXCEPT statement: SELECTManufacturerID, ItemID, ItemName, Description, Notes, Dimensions, BasePrice, SpecialPrice, OrderMinimumQuantity, OrderMultipleQu

I just want the ItemID from the result of this EXCEPT statement:

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)

What would be really nice is if I could save the results of the EXCEPT statement for use in a INSERT INTO query further down the line.

Basically I am going to delete records based on the ItemID's return from this EXCEPT statement from the Products table then insert the ne开发者_JS百科w records which are the result of the same EXCEPT statement - out with the old in with the new.

UPDATE - working solution:

    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)


As you are on SQL Server 2008 you might want to look into MERGE for your synchronisation needs but to answer the question asked you can do

DECLARE @T TABLE (ItemID INT PRIMARY KEY)

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


Separate to Martin's answer about using MERGE...

You can use NOT EXISTS which gives the same query plan and is more readable.

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)


Forget the CTE and table variable: just use MERGE.

The CTE is merely doing what the WHEN [NOT] MATCH part of MERGE does anyhow.

You already have a staging table (StagingProducts) so you don't need @T.

The MERGE will look something like this (I've shortened the column list with ...):

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);
0

精彩评论

暂无评论...
验证码 换一张
取 消