sql - 为什么我的sql语句多次返回相同的输出
问题描述
大家见鬼。
我做了一个 sql 语句,它返回了老师的名字,他必须上课的时间以及他正在上课的类型。我的陈述返回了我的期望,但它多次返回相同的答案,这是为什么呢?我不太了解它。
这是我的声明
SELECT
`profile`.`name`,
`profile`.nachname,
unterichts_zeit.zeit,
unterichts_typ.typ
FROM
unterichts_zeit
INNER JOIN `profile` ON unterichts_zeit.lehrer = `profile`.id ,
unterichts_typ
我的输出
teacher1 teacher1 9:35 klavier
teacher2 teacher2 10:35 klavier
teacher1 teacher1 9:35 gittare
teacher2 teacher2 10:35 gittare
teacher1 teacher1 9:35 generell
teacher2 teacher2 10:35 generell
teacher1 teacher1 9:35 schlagzeug
teacher2 teacher2 10:35 schlagzeug
teacher1 teacher1 9:35 trombone
teacher2 teacher2 10:35 trombone
teacher1 teacher1 9:35 generell
teacher2 teacher2 10:35 generell
现在看到这个它也没有真正显示我想要的......它显示了每种类型的不正确obv的类......该死
如果有人知道我该如何解决这个问题
谢谢你
解决方案
您已经混合了连接样式并创建了笛卡尔积。笛卡尔积是行数增加的地方,因为不相关的行连接在一起。有时它很有用,但通常不是必需的
在你的 sql 语句的最后你有一个逗号,然后是另一个表名
数据库已经完成了它对 INNER JOINed 表对所做的工作,然后将它们中的每一行与该表中的每一行组合起来
如果您打算将 3 个表连接在一起,请使用另一个内部连接语句
SELECT
`profile`.`name`,
`profile`.nachname,
unterichts_zeit.zeit,
unterichts_typ.typ
FROM
unterichts_zeit
INNER JOIN `profile` ON unterichts_zeit.lehrer = `profile`.id
INNER JOIN unterichts_typ ON <<fill-this-on-clause-out>>
在过去,我们像这样加入表格:
SELECT *
FROM a, b, c
WHERE a.id = b.id AND b.id = c.id
如果您不使用 WHERE 子句,则 db 只会输出每个行组合。如果 A 包含 1 和 2 并且 B 包含 "x" 和 "y" 并且 c 包含 true 和 false 你会得到:
1,x,true
1,x,false
1,y,true
1,y,false
2,x,true
2,x,false
2,y,true
2,y,false
现在现代的等价物是使用 INNER JOIN,而且忘记 ON 子句(相当于使用 where 子句的旧方法)要困难得多,因为这样做是语法错误。但是 db 仍然允许使用旧方式,甚至允许混合。您的语句末尾有“逗号表名”是一种混合连接样式,是产生笛卡尔积的旧方法(忘记了 where 子句)
推荐阅读
- android - 在哪里存储视频流 android 应用程序的视频?
- java - InvocationTargetException 与目标:javax.xml.ws.WebServiceException:java.util.NoSuchElementException
- javascript - 反应原生映射元素组
- javascript - 在特定路径javascript中保存捕获的屏幕截图
- flutter - 在 SearchDelegate 中颤动 FutureBuilder
- javascript - 物化 css 轮播在 Angular 中不起作用
- ansible - Ansible:仅打印用户定义的变量
- windows - W10 CMD 文件
- c++ - 使用自定义结构将结果存储在 C++ 中的映射中
- python - 如何调用python脚本的先前输出