繁体   English   中英

SQL 查询在不同的表中不一致

[英]SQL Query not consistent across different tables

我有3张桌子。

  1. 球队名称,球队胜率,球队位置。
  2. 球队名称、球队胜率、球队位置、球队价值、球队球迷数量。
  3. 球队名称,球员姓名,球员工资。
表格1 表 2 表 2
队名 队名 队名
团队胜率 团队胜率
团队位置 团队位置
团队价值
球队球迷人数
参赛者姓名
球员工资

我需要将 3 个表中的 2 个组合起来:

  • 表 1 基于相同的主键团队名称组合表 3,或
  • 表 2 基于相同的主键团队名称加入表 3。

当我按团队名称组合表 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM