2013-04-23 154 views
0

我想根据另一个表中的值更新我的数据库中的一个表。 的2个表是:当满足条件时从另一个表更新一个表上的值

QUOTES(
    QUOTE_ID, 
    APPROVAL 
) 

PRODUCTS(
    QUOTE_ID_FK, 
    LINE_APPROVAL 
) 

我需要更新所有PRODUCTS.LINE_APPROVAL'Y'其中QUOTES.APPROVAL = 'Y'

我已经试过这样的事情,但未能如我没有语法非常正确,但希望你可以看看我想达到什么:

UPDATE 
    PRODUCTS 
SET 
    LINE_APPROVAL = 'Y' 
FROM 
    QUOTES, 
    PRODUCTS    
WHERE 
    PRODUCTS.QUOTE_ID = QUOTES.QUOTE_ID_FK 
AND 
    QUOTES.APPROVAL = 'Y' 

任何帮助,将不胜感激。

回答

2

此查询将更新PQUOTE_ID中值为Quote_ID_FK(且批准为Y)的值的所有产品。

UPDATE 
    PRODUCTS 
SET 
    LINE_APPROVAL = 'Y' 
WHERE 
    PQUOTE_ID IN 
     (SELECT 
      QUOTE_ID_FK 
     FROM 
      QUOTES 
     WHERE 
      APPROVAL = 'Y') 
+0

谢谢,作品一种享受。 – jeeperscreepers 2013-04-23 12:27:47

0

你有你的列名在错误的地方。您的查询应该是:

UPDATE PRODUCTS 
SET  LINE_APPROVAL = 'Y' 
FROM QUOTES, PRODUCTS    
WHERE PRODUCTS.QUOTE_ID_FK = QUOTES.QUOTE_ID 
AND  QUOTES.APPROVAL = 'Y' 

或者INNER JOIN

UPDATE PRODUCTS 
SET  LINE_APPROVAL = 'Y' 
FROM PRODUCTS 
     INNER JOIN QUOTES ON PRODUCTS.QUOTE_ID_FK = QUOTES.QUOTE_ID 
WHERE QUOTES.APPROVAL = 'Y' 
+0

谢谢你的回答。 – jeeperscreepers 2013-04-23 12:26:34

0

试试这个

UPDATE PRODUCTS 
    SET LINE_APPROVAL = 'Y' 
    FROM PRODUCTS 
    INNER JOIN QUOTES ON PQUOTE_ID = QUOTE_ID_FK 
    WHERE APPROVAL = 'Y' 

UPDATE PRODUCTS 
SET LINE_APPROVAL = 'Y' 
WHERE PQUOTE_ID IN 
(SELECT QUOTE_ID_FK FROM 
QUOTES WHERE APPROVAL = 'Y') 
+0

谢谢您的回答 – jeeperscreepers 2013-04-23 12:27:21

3

的@joelharkes与WHERE ... IN回答将工作如果您调整ID列名称。您还可以使用MERGE

MERGE INTO Products 
USING (
    SELECT Quote_ID FROM Quotes 
    WHERE Approval = 'Y') QtApp 
ON (Products.Quote_ID_FK = QtApp.Quote_ID) 
WHEN MATCHED THEN 
    UPDATE SET Line_Approval = 'Y' 
+0

谢谢您的回答,我不知道MERGE。 – jeeperscreepers 2013-04-23 12:25:10

+0

@Ed - 为什么子查询?你可以在update子句中添加一个where。 – haki 2013-04-23 14:59:13

+0

@haki - 您必须将'Products'行与一组数据进行匹配,然后从子查询中获得集合:'USING(SELECT ...)QtApp'。这是'MERGE'语法的必需部分。 'ON'子句指定如何将'PRODUCTS'与子查询中的集合相匹配。您可以在'UPDATE'中放入'WHERE'来进行额外的过滤,但不能用于匹配行。请记住,Oracle不会允许您使用像SQL Server那样的连接查询进行更新,这就是为什么Harshil和Codesleuth的答案虽然很好,但在这里却不被接受 - 它们适用于SQL Server,但不适用于Oracle。 – 2013-04-23 15:15:37