左联接在查询后返回越来越多的行

时间:2019-04-04 16:53:34

标签: sql ms-access

我是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

我想做的是使用表1中的STATIONBOUNDROUTE_NAME来调用表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不返回表1中的所有行?我有一个类似的代码可以在其他类似表中使用。对于不匹配的数据(使用LIKE语句),将为该特定行返回NULL。但是,在此查询中,返回的行较少。

第二问题是,通过LIKE语句,我从表1中返回了表2中符合我的条件的一行或多行(这在我的代码中已经发生,超过2行具有相同的{ {1}}已返回)。如何保持返回的行的最小值?也就是说,如果找到两个ENTRY_ID,请返回下一个。

为此苦了很长时间,非常感谢您的帮助!

更新 我发现句子STOP_SEQUENCE导致第一个问题中缺少行。我将其替换为=,所有行再次出现。但是我仍然需要这个LIKE子句,该怎么办?

1 个答案:

答案 0 :(得分:0)

  

为什么LEFT JOIN不返回表1中的所有行?

我只能怀疑这是您的测试问题,因为您问题中张贴的SQL代码将返回列t1.ENTRY_IDt1.ROUTE_NAMEt1.STATION和&{{表t1.BOUND中所有记录的1}},表t1中所有满足每个记录的连接条件的记录的t2.STOP_SEQUENCE的值在您的表t2中。

请注意,如果多个记录满足表t1中给定记录的联接条件,则它将返回表t2中的多个记录。这会引出您的下一个问题:

  

使用LIKE语句,我从表1中返回了表2中符合我的条件的一行或多行(这在我的代码中已经发生,返回了2+行具有相同ENTRY_ID的行)。如何保持返回的行的最小值?也就是说,如果找到两个STOP_SEQUENCE,则返回下一个。

您可以使用t1函数通过简单的聚合来实现:

min

这将返回select t1.entry_id, t1.route_name, t1.station, t1.bound, min(t2.stop_sequence) as stopseq from t1 left join t2 on t1.station like '*' & t2.station & '*' and t1.bound = t2.route_bound and t1.route_name = t2.route_name group by t1.entry_id, t1.route_name, t1.station, t1.bound t2.stop_sequencet1.entry_id和&{{ 1}}。


此外,请注意,问题中的示例表t1.route_name不包含您发布的代码所引用的字段t1.station