2014-09-26 64 views
0

我想插入行,如果它们不存在(对于特定值)在此表中。SQL查询:插入,如果不是已经存在从2表

我的表,其中我插入是insertTable:

date (date) 
created (datetime) 
category (varchar) 
companyId (int) 
price (decimal 6,3) 

我从内选择我行的两个表之间做加盟:

declare @currentDateTime datetime = getDate() 
declare @currentDate date = getDate() 
INSERT INTO insertTable (date, created, category, companyId, price) 
SELECT @currentDate, @currentDateTime, '30 Day', company.companyId, product.price 
FROM product 
INNER JOIN company 
ON product.companyid = company.companyid 
WHERE product.price >= 0.31 AND ... other conditions on company fields ... 
AND NOT EXISTS(
     SELECT * FROM insertTable WHERE insertTable.price = product.price 
        AND insertTable.date = @currentDateTime 
        AND insertTable.companyid = product.companyid 
        AND LTRIM(RTRIM(insertTable.category)) = '30 Day' 
    ) 

什么我做错了吗?

谢谢

- 戈登Linoff后编辑评论。 我在insertTable中插入了select的结果。 我的问题是,我得到insertTable中的重复。

如果insertTable有

2014-09-26 | 2014-09-26 02:25:00 | 30 Day | 32650 | 0.600 

我的选择将返回像

2014-09-26 | 2014-09-26 02:36:00 | 30 Day | 32650 | 0.600 

东西但是我已经有companyID和价格在插入表

+0

我有一种感觉,我失去了一些东西在我的岗位......我编辑解释我的问题 – Greg 2014-09-26 18:29:43

+0

你知道[ **'MERGE' **](http://msdn.microsoft.com/en-us/library/bb510625.aspx)?听起来像是其中之一的好例子。来自MSDN:_“根据与源表的连接结果对目标表执行操作。例如,您可以通过在一个表中插入,更新或删除行来同步两个表,并根据另一个表中的差异进行同步。“_ – stakx 2014-09-26 19:15:02

+0

@stakx谢谢stakx。Rajesh提出了我不知道的解决方案。谢谢 – Greg 2014-09-26 19:24:15

回答

1

您的问题声明不能准确
费率未定义

你缺少创建
和您比较日期@currentDateTime

SELECT @currentDate, @currentDateTime, '30 Day' 
    , company.companyId, product.price 
    FROM product 
    JOIN company 
    ON product.companyid = company.companyid 
    and product.price >= 0.31 AND ... other conditions on company fields ... 
AND NOT EXISTS(
       SELECT * 
       FROM insertTable 
       WHERE insertTable.date = @currentDate 
       --AND insertTable.created = @currentDateTime 
        AND insertTable.price = product.price 
        AND insertTable.companyid = product.companyid 
        AND LTRIM(RTRIM(insertTable.category)) = '30 Day' 
       ) 
+0

我不介意通过创建进行比较,因为我已经按日期进行了比较。创建日期和日期共享同一日期,但创建的时间不同。不过,您将日期与@currentDateTime进行比较是正确的 – Greg 2014-09-26 19:01:57

0

我不认为你可以这样使用EXISTS函数。我想你可能需要对insertTable表执行一个LEFT JOIN,然后在你的WHERE子句中添加一个“iT.Price IS NULL”。 (这是假设的价格是从来没有真正对你insertTable NULL)。

1

我认为你必须修改你的子查询中NOT EXISTS@currentDateTime变化@currentDaterate.companyid变化company.companyid(因为当插入insertTable.date得到的@currentDateinsertTable.companyid价值得到的价值company.companyid):

... 
AND NOT EXISTS(
     SELECT * FROM insertTable WHERE insertTable.price = product.price 
        AND insertTable.date = @currentDate 
        AND insertTable.companyid = company.companyid 
        AND LTRIM(RTRIM(insertTable.category)) = '30 Day' 
    ) 
+0

感谢Rimas。是的rate.company我的意思是company.companyid。这是一个输入错误,但currentdatetime到currentdate是问题。谢谢! – Greg 2014-09-26 18:59:25

0

您需要关联的子查询,而不是子查询中的连接。

它甚至更好地使用MERGE声明http://msdn.microsoft.com/en-us/library/bb510625.aspx

declare @currentDateTime datetime = getDate() 
declare @currentDate date = getDate() 
INSERT INTO insertTable (date, created, category, companyId, price) 
SELECT @currentDate, @currentDateTime, '30 Day', company.companyId, product.price 
FROM product 
INNER JOIN company 
ON product.companyid = company.companyid 
WHERE product.price >= 0.31 AND ... other conditions on company fields ... 
AND NOT EXISTS(
     SELECT 1 FROM insertTable WHERE insertTable.price = product.price 
        AND insertTable.date = @currentDate 
        AND insertTable.companyid = company.companyid 
        AND LTRIM(RTRIM(insertTable.category)) = '30 Day' 
    ) 

编辑:

你可以做同样的MERGE像下面

MERGE insertTable as target 
USING (SELECT @currentDate, 
      @currentDateTime, 
       '30 Day', 
       company.companyId, 
       product.price 
     FROM INNER JOIN company 
    ON product.companyid = company.companyid 
    WHERE product.price >= 0.31 AND ... other conditions on company fields ... 
) as source (currentDate, currentDateTime, category, companyid, price) 
ON target.price = source.price 
AND target.date = source.currentDate 
and target.companyid = source.companyid 
and LTRIM(RTRIM(target.category)) = '30 Day' 
WHEN NOT MATCHED THEN 
    INSERT (date, created, category, companyId, price) 
    VALUES (source.currentDate, source.currentDatetime, source.category, source.companyId, source.price) 
+0

我不知道如何实现该MERGE语句。我不熟悉MERGE,而且我也没有看到它在你的答案中使用。 – Greg 2014-09-26 19:04:27

+0

@Greg,用MERGE语句更新。你可以根据条件轻松更新或插入合并。 – radar 2014-09-26 19:14:31

+0

感谢您填写您的答案。这似乎适合我的情况。由于我已经编写了我的查询而不存在,我可能会坚持这一点。除非这样做会造成很大的不同ehow? – Greg 2014-09-26 19:22:34

相关问题