[英]SQL Query not consistent across different tables
我有3张桌子。
表格1 | 表 2 | 表 2 |
---|---|---|
队名 | 队名 | 队名 |
团队胜率 | 团队胜率 | |
团队位置 | 团队位置 | |
团队价值 | ||
球队球迷人数 | ||
参赛者姓名 | ||
球员工资 |
我需要将 3 个表中的 2 个组合起来:
当我按团队名称组合表 1 和表 3 时,连接工作完美,结果列有:团队名称、团队获胜率、团队位置、球员姓名、球员薪水。 但是,在执行表 2 和表 3 时,我没有得到任何结果,尽管表 2 和表 1 几乎相同。
我尝试通过执行以下操作来检查表 1 中的团队名称和表 2 中的团队名称是否相同:
SELECT TABLE1.TEAMNAME, TABLE2.TEAMNAME
FROM TABLE1
JOIN TABLE2 ON TABLE1.TEAMNAME = TABLE2.TEAMNAME
或者类似的东西,我得到了带有列的表格:table1teamname 和 table2teamname 并排没有问题,它们完全相同。 但是,当我按照以下方式进行操作时:
SELECT TABLE2.TEAMNAME, TABLE3.TEAMNAME
FROM TABLE2
JOIN TABLE3 ON UPPER(TABLE3.TEAMNAME) LIKE ('%'||UPPER(TABLE2.TEAMNAME)||'%')
我没有得到任何结果,而如果尝试类似的东西:
SELECT TABLE1.TEAMNAME, TABLE3.TEAMNAME
FROM TABLE1
JOIN TABLE3 ON UPPER(TABLE3.TEAMNAME) LIKE ('%'||UPPER(TABLE1.TEAMNAME)||'%')
它工作得很好,我得到两列 table2.teamname 和 table 3.teamname 都相似(表 3 中的团队名称是更长的版本并且大写)并排但完全匹配。
为什么会出现这个问题? 表 1 和表 2 基本相同,只是在表中添加了几列,结果相同,但一个表每行的列多一些。
总结一下,表 1 和表 2 完全相同,但是表 1 与表 3 的团队名称模糊匹配有效并给出了数据行,而表 2 与表 3 的模糊匹配不给出没有匹配数据的行。 为什么是这样?
也许有意想不到的空间填充。 查看以下内容:
CREATE TABLE names (
id int
, name varchar(20)
) charset=UTF8;
INSERT INTO names VALUES
(1, 'name1')
, (2, 'name1 ')
, (3, 'name2')
;
SELECT names.*
, 'name1' = names.name
, 'name1' LIKE CONCAT('%', names.name, '%')
FROM names
;
结果:
+------+--------+----------------------+-------------------------------------------+
| id | name | 'name1' = names.name | 'name1' LIKE CONCAT('%', names.name, '%') |
+------+--------+----------------------+-------------------------------------------+
| 1 | name1 | 1 | 1 |
| 2 | name1 | 1 | 0 |
| 3 | name2 | 0 | 0 |
+------+--------+----------------------+-------------------------------------------+
id = 2 的行中名称上的额外尾随空格会导致等于比较匹配,但 LIKE 比较不会!
对于某些排序规则,SQL 标准支持此行为。 请参阅<character set specification>
和“PAD SPACE 特性”。
更新:
SELECT names.*
, 'name1' = names.name
, 'name1' LIKE CONCAT('%', names.name, '%')
, 'name1' LIKE names.name
FROM names
;
+------+--------+----------------------+-------------------------------------------+-------------------------+
| id | name | 'name1' = names.name | 'name1' LIKE CONCAT('%', names.name, '%') | 'name1' LIKE names.name |
+------+--------+----------------------+-------------------------------------------+-------------------------+
| 1 | name1 | 1 | 1 | 1 |
| 2 | name1 | 1 | 0 | 0 |
| 3 | name2 | 0 | 0 | 0 |
+------+--------+----------------------+-------------------------------------------+-------------------------+
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.