2017-05-25 79 views
0

我的情况如下(SQLfiddle)给出:SQLite的更新多条记录与不同的值由查询

我有两个表PeopleScores,他们看起来是这样的:

CREATE TABLE People 
(
    name TEXT, 
    minScore INTEGER, 
    maxScore INTEGER, 
    FOREIGN KEY (minScore) REFERENCES B(rowid), 
    FOREIGN KEY (maxScore) REFERENCES B(rowid) 
); 

INSERT INTO People (name) VALUES ('Terry'); 
INSERT INTO People (name) VALUES ('Bob'); 

CREATE TABLE Scores 
(
    nameID INTEGER, 
    score INTEGER, 
    FOREIGN KEY (nameID) REFERENCES A(rowid) 
); 

INSERT INTO Scores (nameID, score) VALUES (1, 10); 
INSERT INTO Scores (nameID, score) VALUES (1, 8); 
INSERT INTO Scores (nameID, score) VALUES (1, 5); 
INSERT INTO Scores (nameID, score) VALUES (2, 12); 
INSERT INTO Scores (nameID, score) VALUES (2, 8); 
INSERT INTO Scores (nameID, score) VALUES (2, 2); 

我想更新People表以包含其minScoremaxScorerowID。我怎么做?

目的:

Terry | 5 | 10 
Bob | 2 | 12 

这是我曾尝试:

CREATE VIEW minScores 
AS 
    SELECT Scores.rowid AS scoreID, Scores.nameID AS nameID 
    FROM Scores 
    WHERE score IN (SELECT MIN(score) 
        FROM Scores AS Scores2 
        GROUP BY Scores2.nameID); 

UPDATE People 
SET minScore = (SELECT scoreID FROM minScores) 
WHERE People.rowid IN (SELECT nameID FROM minScores) 

刚刚填充表的最后一个最小值。

(我不得不使用一个观点,因为我无法了解如何使用工作...)

+0

谢谢你为编辑@CL。这读起来好多了。 – NE5534

回答

1

你更新使用scalar subquery;其值

是所附SELECT语句结果的第一行。换句话说,隐含的“LIMIT 1”被添加到子查询中。

要获取不同的行不同的结果,你必须使用一个correlated subquery

UPDATE People 
SET minScore = (SELECT rowid 
       FROM Scores 
       WHERE Scores.nameID = People.rowid 
       ORDER BY score ASC), 
    maxScore = (SELECT rowid 
       FROM Scores 
       WHERE Scores.nameID = People.rowid 
       ORDER BY score DESC); 

(你不应该使用外键隐含rowid;其价值can change

+0

谢谢@CL。今天早上我会在火车上多学习一点。我不知道不使用rowid,我被告知,它比创建ID密钥更好,但我认为我的讲师并不知道它可能会改变(除非我得到了错误的结尾)。 – NE5534

相关问题