2014-12-12 2 views
1

저는 SQL에서 멍청한 사람이고 SQLite로 작업하기 시작했습니다.이 사이트가 내 첫 번째 게시물이기 때문에 내 고유의 부족함을 용서해주십시오. 이해. 나는 BA로 졸업 한 후에 스스로 가르쳤으므로 나에게 열중 해주세요.SQLite : 다른 테이블에 설정된 조건을 기반으로 하나의 열을 업데이트하십시오.

모든 데이터가 동일한 테이블의 일부인 경우에만 다음 쿼리를 사용할 수 있습니다. 이후로 두 테이블을 세 개의 개별 테이블로 분리했습니다 : widgetCustomer, widgetSale 및 widgetOrderInfo.

UPDATE widgetOrderInfo 
    SET extendedcost = (cost * qty) * (0.80) 
    WHERE widgetCustomer.IsASenior = 'Y'; 
      -- Seniors get a 20 percent discount; 

^^ 문제가있는 부분입니다. 이 쿼리를 사용할 때마다 SQLite는 "No such column : IsASenior."를 반환합니다.

- 참고 : IsASenior는 코드에서 이전에 트리거를 기반으로 'Y'또는 'N'으로 설정된 widgetCustomer의 열입니다.

UPDATE widgetOrderInfo 
    SET extendedcost = (cost * qty); 

, 내가 알고 아주 기본적인,하지만 난 내가하기 위해 무엇을해야하는지 확실 해요 : 나는 다음과 같은 쿼리를 사용하여 widgetOrderInfo 테이블에 데이터 만 사용하여 매우 쉽게 작업 할 기본 곱셈 왔 내 widgetOrderInfo 테이블을 가져 와서 widgetCustomer의 'IsASenior'열의 데이터를 확인합니다.

UPDATE 문의 두 테이블 간의 데이터에 액세스하려면 JOIN을 사용해야합니까?

도움이 될 것입니다. 감사!


CREATE TABLE widgetCustomer 
    (id INTEGER PRIMARY KEY, name TEXT, age INT, IsASenior TEXT, last_order_id INT, soItemID INT); 
CREATE TABLE widgetSale 
    (id INTEGER PRIMARY KEY, item_id INT, item_name TEXT, customer_id INT, quan INT, price MONEY(8,2)); 
CREATE TABLE widgetOrderInfo 
    (id INTEGER PRIMARY KEY, salesOrderID INT, cost MONEY(8,2), qty INT, extendedcost MONEY(8,2)) 

; I은 공연있다 구요 QUERIES (WIP 위치 표시기 많이) OF


FULL AND ORDER LIST;

CREATE TRIGGER SeniorCheck AFTER INSERT ON widgetCustomer 
    BEGIN 
     UPDATE widgetCustomer 
     SET IsASenior = 'Y' WHERE age >= 65; 
     UPDATE widgetCustomer 
     SET IsASenior = 'N' WHERE age < 65; 
    END 

;

INSERT INTO widgetCustomer (name, age, soItemID) 
    VALUES ('Ian', 24, 3); 
INSERT INTO widgetCustomer (name, age, soItemID) 
    VALUES ('Andrew', 29, 2); 
INSERT INTO widgetCustomer (name, age, soItemID) 
    VALUES ('John', 65, 1); 
INSERT INTO widgetCustomer (name, age, soItemID) 
    VALUES ('Kathy', 60, 4) 

;

CREATE TRIGGER newWidgetSale AFTER INSERT ON widgetSale 
    BEGIN 
     UPDATE widgetCustomer 
     SET last_order_id = NEW.id 
     WHERE widgetCustomer.id = NEW.customer_id; 
    END 

;

INSERT INTO widgetSale (item_id, item_name, customer_id, quan, price) 
    VALUES (1, 'Blue Brick', 3, 50, 9.95); 
INSERT INTO widgetSale (item_id, item_name, customer_id, quan, price) 
    VALUES (2, 'Red Brick', 2, 30, 4.95); 
INSERT INTO widgetSale (item_id, item_name, customer_id, quan, price) 
    VALUES (3, 'Black Brick', 1, 24, 9.95); 
INSERT INTO widgetSale (item_id, item_name, customer_id, quan, price) 
    VALUES (4, 'Yellow Brick', 4, 30, 9.95) 

;

CREATE TRIGGER SubtractQuan AFTER INSERT ON widgetOrderInfo FOR EACH ROW 
    BEGIN 
     UPDATE widgetSale 
     SET quan = (quan - New.qty) 
     WHERE customer_id = New.id; 
    END 

;

INSERT INTO widgetOrderInfo (salesOrderID, cost, qty) 
     VALUES (283001, 9.95, 4); 
INSERT INTO widgetOrderInfo (salesOrderID, cost, qty) 
     VALUES (283002, 4.95, 8); 
INSERT INTO widgetOrderInfo (salesOrderID, cost, qty) 
     VALUES (283003, 9.95, 5); 
INSERT INTO widgetOrderInfo (salesOrderID, cost, qty) 
     VALUES (283004, 9.95, 15) 

;

UPDATE widgetOrderInfo 
    SET extendedcost = (cost * qty) 

;

SELECT 
    CASE 
     WHEN qty BETWEEN 5 and 7 THEN 'parcel' 
     WHEN qty BETWEEN 8 and 14 THEN 'package' 
     WHEN qty BETWEEN 15 and 30 THEN 'box' 
     WHEN qty BETWEEN 31 and 99 THEN 'crate' 
    ELSE 'individually wrapped' 
END 
    AS PackagingBasedOnPurchaseSize, 
    COUNT(*) qty FROM widgetOrderInfo 
    GROUP BY 
    CASE 
     WHEN qty BETWEEN 5 and 7 THEN 'parcel' 
     WHEN qty BETWEEN 8 and 14 THEN 'package' 
     WHEN qty BETWEEN 15 and 30 THEN 'box' 
     WHEN qty BETWEEN 31 and 99 THEN 'crate' 
    ELSE 'individually wrapped' 
END 

;

SELECT * FROM widgetSale; 
    SELECT * FROM widgetCustomer; 
    SELECT * FROM widgetOrderInfo; 

할 필요가있는 경우 내 전체 데이터베이스에 대한 링크를 제공 할 수 있습니다.


+1

위젯 오더 정보를 'widgetCustomer'에 가입해야합니다. 우리가 쉽게 당신을 도울 수 있도록 테이블 스키마를 제공하십시오. –

+0

테이블 간의 관계를 설명하기 위해 외래 키를 추가해야합니다. UPDATE는 쓰기 쉽습니다. – syllabus

답변

1

UPDATE 문에서 직접 업데이트 된 테이블에만 액세스 할 수 있습니다. 다른 테이블에 액세스하려면 하위 쿼리가 필요합니다.

고위 고객과 관련된 주문 정보 행을 찾으려면, 당신은 상관 하위 쿼리와 행 각 주문 정보를 원하시면 해당 고객 행을 조회 할 수 있습니다 :

UPDATE widgetOrderInfo 
SET extendedcost = (cost * qty) * (0.80) 
WHERE (SELECT IsASenior 
     FROM widgetCustomer 
     JOIN widgetSale ON widgetCustomer.id = widgetSale.customer_id 
     WHERE widgetSale.id = widgetOrderInfo.salesOrderID 
    ) = 'Y'; 

또는 먼저 시니어 고객을 얻고, 확인하는 주문 정보는 다음 세트에 있습니다 :

UPDATE widgetOrderInfo 
SET extendedcost = (cost * qty) * (0.80) 
WHERE salesOrderID IN (SELECT widgetSale.id 
         FROM widgetCustomer 
         JOIN widgetSale ON widgetCustomer.id = widgetSale.customer_id 
         WHERE IsASenior = 'Y'); 
관련 문제