我是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中的STATION
,BOUND
和ROUTE_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子句,该怎么办?
答案 0 :(得分:0)
为什么LEFT JOIN不返回表1中的所有行?
我只能怀疑这是您的测试问题,因为您问题中张贴的SQL代码将返回列t1.ENTRY_ID
,t1.ROUTE_NAME
,t1.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_sequence
,t1.entry_id
和&{{ 1}}。
此外,请注意,问题中的示例表t1.route_name
不包含您发布的代码所引用的字段t1.station
。