【发布时间】:2019-04-04 16:53:34
【问题描述】:
我是 SQL 新手,我想寻求帮助。我有 2 个要加入的表,我想生成与表 1 相同的行数。
这是表格:
表 1
+----------+------------+---------+-------+
| ENTRY_ID | ROUTE_NAME | STATION | BOUND |
+----------+------------+---------+-------+
| 1 | 1A | ABCC | 1 |
| 2 | 2C | CBDD | 1 |
| 3 | 5 | AAAA | 2 |
| 4 | 1A | EEEE | 1 |
| 5 | 2B | ASFA | 2 |
| 6 | 5 | DSAS | 1 |
| 7 | 3 | QWEA | 2 |
| 8 | 4 | ASDA | 1 |
+----------+------------+---------+-------+
表 2
+------------+-------+---------+---------------+
| ROUTE_NAME | BOUND | STATION | STOP_SEQUENCE |
+------------+-------+---------+---------------+
| 1A | 1 | AAA | 1 |
| 1A | 1 | ABC | 2 |
| 1A | 1 | CDA | 3 |
| 1A | 2 | ABC | 1 |
| 1A | 2 | ADC | 2 |
| 1A | 2 | ACA | 3 |
重复其他路线
表格的简短说明:
Table 1 包含某些中转行程,中转路线为ROUTE_NAME,出发站为STATION,中转方向为BOUND(仅1/2)。
Table 2包含一组公交路线数据,字段与表1类似,停靠顺序为STOP_SEQUENCE
我想做的是使用STATION、BOUND和ROUTE_NAME在表1中调用表2中的STOP_SEQUENCE。我使用的代码是:
SELECT t1.ENTRY_ID, t1.ROUTE_NAME, t1.STATION, t1.BOUND, t2.STOP_SEQUENCE
FROM T1
LEFT JOIN t2 ON
(t1.STATION LIKE '*' & t2.STATION & '*') AND
(t1.BOUND = t2.BOUND) AND
(t1.ROUTE_NAME = t2.ROUTE_NAME);
LIKE 是必须的,因为两个表的 STATION 字符串之间存在一些不匹配,可以由函数处理。
第一个问题是,为什么 LEFT JOIN 不能返回 TABLE 1 中的所有行?我有一个类似的代码可以在其他类似的表中使用。对于不匹配的数据(使用 LIKE 语句),为该特定行返回 NULL。但是,在此查询中返回的行数较少。
第二个问题是,使用 LIKE 语句,我从表 1 中返回符合我的条件的表 2 中的一行或多行(这在我的代码中发生了 2+ 行具有相同 @ 987654334@ 已被退回)。如何保持返回行的最小值?即如果找到两个STOP_SEQUENCE,则返回较低的那个。
为此苦苦挣扎了很长时间,非常感谢您的帮助!
更新
我发现句子 t1.STATION LIKE '*' & t2.STATION & '*' 导致第一个问题中缺少行。我已将其替换为 = 并且所有行都再次出现。但是我仍然需要这个 LIKE 子句,我该怎么办?
【问题讨论】: