改进了多表SQL(MySQL)查询的方式?

时间:2013-02-22 14:02:12

标签: sql left-join correlated-subquery multi-query


希望你能提供帮助。我有三个表,并希望创建一个条件查询,根据行在一个表中的存在来制作一个子集,然后从结果中排除行,然后查询最终的第三个表。我认为这很简单,但我在SQL中没有很好的实践,在左连接,相关子查询等研究/测试6小时后,它有所帮助,但我仍然无法达到正确的结果集。所以这是设置:

T1
arn_mkt_stn
A00001_177_JOHN_FM
A00001_177_BILL_FM
A00001_174_DAVE_FM
A00002_177_JOHN_FM
A00006_177_BILL_FM
A00010_177_JOHN_FM
- 注意:名称与3位数字前缀的关系(例如_177)和FM部分始终保持一致:'_177_JOHN_FM'仅A000XX更改

T2
arn_mkt
A00001_105
A00001_177
A00001_188
A00001_246
A00002_177
A00003_177
A00004_026
A00004_135
A00004_177
A00006_177
A00010_177


示例:因此,如果_177_JOHN_FM是T1中arn_mkt_stn行的子字符串,则在从T2获取子字符串为177的arn_mkts时将其排除 - 在这种情况下,所需的结果集将为:
A00003_177
A00004_177
A00006_177

同样,_177_BILL_FM将返回:
A00002_177
A00003_177
A00004_177
A00010_177


然后我想使用这个结果集从第三个表中提取基于'A00003'等的记录 T3
阿尔恩
A00001
A00002
A00003
A00004
A00005
A00006
...

我尝试了很多方法[这里$ stn_code = JOHN_FM和$ stn_mkt = 177] “SELECT * FROM T2,T1 WHERE arn!= SUBSTRING(T1.arn_mkt_stn,1,6)
AND SUBSTRING(T1.arn_mkt_stn,12,7)='$ stn_code'
AND SUBSTRING(arn_mkt,8,3)='$ stn_mkt'
(然后使用此结果查询T3 ..)

也是左连接和子查询,但我显然遗漏了一些东西! 任何指针都感激不尽,谢谢,

[编辑:感谢帮助sgeddes。我将扩展上面的逻辑...首先,所需的结果集始终只与每个查询的一个名称相关联,例如,从T1开始,让我们使用JOHN_FM。在T1中,JOHN_FM当前与'arn'(在arn_mkt_stn内)相关联:A00001,A00002& A00010' 。 T2中的下一步是查找具有JOHN_FM的3位前缀(177)的所有'arn(在arn_mkt内)',然后排除T1中的那些。注意:A00006仍然存在,因为它未连接到T1中的JOHN_FM。对于BILL_FM的相同查询给出了略微不同的结果,不包括A00001& A00006因为它在T1中有这个关联..谢谢,R]

1 个答案:

答案 0 :(得分:1)

您可以使用LEFT JOIN从T2中删除与T1中的记录匹配的记录。但是,我不确定我是否理解你的逻辑。

你说A00001_177_JOHN_FM应该返回:

A00003_177
A00004_177
A00006_177

但是,A00006_177_BILL_FM不会从上述结果中排除A00006_177吗?

如果我理解正确的话,这个查询应该是关闭的(不完全确定你需要返回哪些字段)到你正在寻找的东西:

SELECT T2.arn_mkt, T3.arn
FROM T2 
  LEFT JOIN T1 ON
    T1.arn_mkt_stn LIKE CONCAT(T2.arn_mkt,'%')
  INNER JOIN T3 ON
    T2.arn_mkt LIKE CONCAT(T3.arn,'%')
WHERE T1.arn_mkt_stn IS NULL

Sample Fiddle Demo

<强> - 编辑 -

回顾评论,这应该是您正在寻找的:

SELECT *
FROM T2 
  LEFT JOIN T1 ON
    T1.arn_mkt_stn LIKE CONCAT(LEFT(T2.arn_mkt,LOCATE('_',T2.arn_mkt)),'%') AND T1.arn_mkt_stn LIKE '%JOHN_FM'
  INNER JOIN T3 ON
    T2.arn_mkt LIKE CONCAT(T3.arn,'%')
WHERE T1.arn_mkt_stn IS NULL 

这是更新的小提琴:http://sqlfiddle.com/#!2/3c293/13