SQLite查询获取两个维度记录(学生与测验)

时间:2017-08-29 11:27:03

标签: mysql sql database sqlite

我是sqlite的新手,我有三张桌子,学生,测验和标记表。我想用单个sqlite查询在CVS中编写所有数据。我想从代码中删除多个for循环和条件,并使用单个查询处理。我在sql中创建了查询,但我不明白它在SQLlite中应该如何。它看起来像二维(学生数量与测验数量)。 学生表:

Id | StudentId | Name       
1  | 001       | ABC

2  | 002       | EFG

3  | 003       | XYZ

测验表:

QId |TotalMark | Question    

1   |   10     | ABC

2   |   10     | TUI

3   |   10     | LMP

标记表:

SId   | QID | Marks

001   |   1 | 4

002   |   1 | 6

003   |   1 | 7

001   |   2 | 5

002   |   2 | 6

003   |   2 | 7

001   |   3 | 9

002   |   3 | 6

003   |   3 | 7

必需的输出是:

Id | StudentId | Name | ABC | TUI|  LMP

1  | 001       | ABC  |  4  | 5  |  6

2  | 002       | EFG  |  4  | 5  |  6

3  | 003       | XYZ  |  4  | 5  |  6

DROP TABLE  H;
DROP TABLE  T;
SELECT TOP 1 
        STUFF(( SELECT ', '  + M.title 
                FROM    dbo.marksheet M
                        INNER JOIN marksheet_item MI ON M.marksheet_id = MI.marksheet_id
                        INNER JOIN dbo.student SS ON SS.stu_id = MI.stu_id
                WHERE   S.stu_id = SS.stu_id
              FOR
                XML PATH('')
              ), 1, 2, '') AS ReportHeader
INTO    H
FROM    student S
GROUP BY S.stu_id,S.stu_name;

SELECT  MIN(stu_id) AS ID ,
        S.stu_id ,S.stu_name,
        STUFF(( SELECT ', '  + CAST(MI.marks AS VARCHAR(50))
                FROM    dbo.marksheet M
                        INNER JOIN marksheet_item MI ON M.marksheet_id = MI.marksheet_id
                        INNER JOIN dbo.student SS ON SS.stu_id = MI.stu_id
                WHERE   S.stu_id = SS.stu_id
              FOR
                XML PATH('')
              ), 1, 2, '') AS report
INTO    t
FROM    student S
GROUP BY S.stu_id,S.stu_name;

SELECT  *FROM    h;
SELECT  *FROM    t;

1 个答案:

答案 0 :(得分:1)

你没有。

SQLite在本地运营。因此,没有网络延迟,很少有事务问题等等,这就是您希望在典型的DBMS中避免多个查询而不是执行这些复杂语句的原因。

在SQLite中,与仅在代码中编写逻辑相比,创建和删除表以及解释复杂查询的开销相对较大。您可以毫无问题fire hundreds of queries select without running into performance issues

同样创建和删除表或任何数据,只会使存储文件膨胀,因为在执行显式清理之前SQLite不会删除。