我只想从这个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)
答案 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);