SELECT * FROM (SELECT c_id FROM student st INNER JOIN score sc ON sc.s_id =st.s_id where st.s_id ="01") tb1,(select * from student st,score sc WHERE sc.s_id=st.s_id) tb2 WHERE tb1.s_id=tb2.s_id哪里有错误
时间: 2024-04-27 12:22:43 浏览: 87
这个查询语句本身没有语法错误,但是可能存在逻辑错误。具体来说,它将两张表进行了笛卡尔积,然后筛选出选课与学号为"01"的同学相同的学生信息。这样做的结果是会返回符合条件的学生信息,但是可能会有重复的记录,因为同一学生可能会有多门课程与学号为"01"的同学所学相同。如果要避免重复的记录,可以使用 DISTINCT 关键字去重,或者使用 GROUP BY 子句对结果进行分组。
相关问题
SELECT * FROM (SELECT c_id FROM student st INNER JOIN score sc ON sc.s_id =st.s_id where st.s_id ="01") tb1,(select st.s_id,st.s_name,sc.c_id,sc.s_score from student st inner join score sc on sc.s_id=st.s_id) tb2 WHERE tb1.s_id=tb2.s_id > 1054 - Unknown column 'tb1.s_id' in 'where clause'
根据您提供的 SQL 语句来看,似乎存在一个语法错误。在第二个 WHERE 子句中,您引用了一个未定义的列 `tb1.s_id`。这是因为在您的查询中,`tb1` 子查询仅包含 `c_id` 列,而不包含 `s_id` 列。
如果您想要连接 `tb1` 和 `tb2` 子查询,您需要确保它们都具有相同的连接列,然后将它们包装在一个更大的子查询中。例如,您可以尝试以下查询:
```
SELECT tb2.s_id, tb2.s_name, tb2.c_id, tb2.s_score
FROM
(SELECT c_id, s_id FROM student st INNER JOIN score sc ON sc.s_id = st.s_id WHERE st.s_id = '01') tb1
INNER JOIN
(SELECT st.s_id, st.s_name, sc.c_id, sc.s_score FROM student st INNER JOIN score sc ON sc.s_id = st.s_id) tb2
ON tb1.s_id = tb2.s_id
WHERE tb2.s_score > 1054
```
这个查询首先选出学号为 `'01'` 的学生所选的所有课程,并将结果存储在 `tb1` 子查询中。然后,它将 `tb1` 和 `tb2` 子查询连接起来,并选出成绩大于 `1054` 的所有记录。
SELECT DISTINCT tb2.s_name FROM (SELECT c_id FROM student st INNER JOIN score sc ON sc.s_id =st.s_id where st.s_id ="01") tb1,(select st.s_id,st.s_name,sc.c_id,sc.s_score from student st inner join score sc on sc.s_id=st.s_id) tb2 WHERE tb1.c_id=tb2.c_id
这个 SQL 查询将返回学号为 "01" 的学生所选的所有课程的学生名字。它使用了两个子查询 `tb1` 和 `tb2`,并通过 `c_id` 列将它们联接起来,最后从 `tb2` 子查询中选择不同的学生名字。
具体来说,`tb1` 子查询选出了学号为 "01" 的学生所选的所有课程的课程 ID,存储在 `c_id` 列中。`tb2` 子查询选出了所有学生的学号、姓名、所选课程的课程 ID 和成绩。两个子查询通过 `c_id` 列联接起来,找出所有选了这些课程的学生信息,最后通过 `DISTINCT` 关键字去重,只返回不同的学生名字。
需要注意的是,如果有多个学生选了相同的课程,那么这个查询将返回这些学生的并集的不同的名字。
阅读全文