Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
要求SQL正确选择数据_Sql_Sqlite - Fatal编程技术网

要求SQL正确选择数据

要求SQL正确选择数据,sql,sqlite,Sql,Sqlite,我有一个数据库,里面有一所学校的所有学生、每个班级的年份和班级编号。因为你需要在我的国家上学5年,每个学生在这个数据库中都有5行写着他的名字,但是每次都是不同的班级,所以行是不一样的 我希望SQL在我的数据库中选择同学。所有的班级都由不同的同学组成,但是你可以连续两年和同一个同学在一起 我想知道一个学生是否与学生1和学生2在同一个班级,但不是在同一时间。如果一个学生在第一年和第二年在一起,这是可以的,就像这是一个普通的学生一样。图中正确答案是卢西恩·莱克 我尝试了这个代码,但它不起作用,因为它只

我有一个数据库,里面有一所学校的所有学生、每个班级的年份和班级编号。因为你需要在我的国家上学5年,每个学生在这个数据库中都有5行写着他的名字,但是每次都是不同的班级,所以行是不一样的

我希望SQL在我的数据库中选择同学。所有的班级都由不同的同学组成,但是你可以连续两年和同一个同学在一起

我想知道一个学生是否与学生1和学生2在同一个班级,但不是在同一时间。如果一个学生在第一年和第二年在一起,这是可以的,就像这是一个普通的学生一样。图中正确答案是卢西恩·莱克

我尝试了这个代码,但它不起作用,因为它只告诉我所有学生的学生保罗·比卢克斯

SELECT *
FROM Lignes
WHERE (year, class) IN (SELECT year, class FROM Lignes WHERE name_student = 'Paul Biloux')
正如我所说,这段代码只会选择Paul Biloux的所有同学

SELECT *
FROM Lignes
WHERE (year, class) IN (SELECT year, class FROM Lignes WHERE name_student = 'Paul Biloux')
我想知道保罗·比卢克斯和杰克·卢西恩·莱克之间是否有一个共同的学生知道保罗和杰克从来没有在同一个班上过

SELECT *
FROM Lignes
WHERE (year, class) IN (SELECT year, class FROM Lignes WHERE name_student = 'Paul Biloux')
AND (year, class) IN (SELECT year, class FROM Lignes WHERE name_student = 'Jack Spiral')

它不适用于最后这段代码,输出的是两个学生的同一个班级的学生列表,而不是一个公共链接。有人知道如何得到这个结果吗?

首先,你需要按年份列出所有的同学对,然后将同一学生在不同年份的结果合并到一起。最新的SQLLite支持公共表表达式,这使此查询看起来非常干净:

With classmates AS (Select a.Class, a.Year, a.student_name as studenta, b.student_name as studentb
                From Lignes a Inner Join Lignes b ON a.Class=b.Class and a.Year=b.Year
                Where a.student_name<>b.student_name
                )
Select x.studentb, '(', x.studenta, x.Year, x.Class, ')  (', y.studentb, y.Year, y.Class, ')'
From classmates x Inner Join classmates y on x.studentb=y.studenta
Where x.Year<>y.year and x.studenta<>y.studentb
Order By x.studentb, x.studenta, y.studentb
此结果可以列出同一个学生两次,因为它们由多个学生对连接。如果您只想查看该学生的姓名一次,则可以向该查询添加GROUPBY子句


你的描述有点不完整,所以我假设你的学生1和学生2在不同的年份是不同的人。如果一个学生在不同的年份重复上课,那么会有大量的学生三胞胎满足你对同一个普通学生的条件。

创建一个CTE,返回学生的名字:“杰克·斯莱普”和“保罗·比卢克斯”。 另一个CTE返回这两个学生之间常见的班级/年级组合。 最后做一个表格的自连接,得到这两个学生的所有同学,按同学分组,并在HAVING子句中设置条件:


请参阅。

上一个查询无法工作,因为没有任何记录可以满足name\u student='Paul Biloux'和'Jack Spiral'的条件。也许:哪一年,哪一年的班级,哪一年的班级,哪一年的班级,哪一年的班级,哪一年的班级,哪一年的班级,哪一年的班级,哪一年的班级,哪一年的班级,哪一年的班级,哪一年的班级,哪一年的班级,哪一年的班级,哪一年的班级,哪一年的班级,哪一年的班级,哪一年的班级,哪一年的班级,哪一年的班级。它没有工作,我有一个错误不完整的错误,我正在寻找的reason@d0little我什么都没有。没有错误,只有一个空白作为output@KenWhite好的,谢谢我修改了这个,对不起。关于这一点,我知道的不多。谢谢你的回答,很抱歉我的回答不准确。当我使用您编写的代码时,出现了一个错误,即列名不明确:Class。你知道为什么吗?我必须用真实的学生名字替换一些代码吗?例如,是否需要将a.student_名称替换为Paul Biloux?很抱歉,我是SQL的新手。在Ligne a和Ligne B中都有一个类,您的db经理对选择哪个类很挑剔,尽管它们总是相等的。我在上面解决了这个问题。这个解决方案产生了所有符合你条件的人。1.一个人在同一个班级,两个人在不同的年份。这个解决方案检查很多组合,并且随着班级规模的增加,速度会非常慢。例如,如果平均班级人数为25人,则每个班级每年有600对同学,这将增加到360000对可能的三胞胎进行检查。此外,此处似乎缺少一些约束。当我上学时,我年复一年地和同一批核心同学在一起。如果卢西恩和保罗、杰克一起上了三、四、五年级,那么这将证明卢西恩和保罗在三年级,杰克在四年级,反之亦然。非常感谢@forpas。它工作得非常好,演示非常有用!这对我有很大帮助