2017-07-06 58 views
1

我对SQL很新颖。我相信这是一项对很多人来说很简单的操作。我试图在同一台服务器上的数据库上分别加入两个表 - dbB和dbA,分别为TableA(带IdA)和TableB(带IdB)。但在此之前,我想将列IdA转换为数字,我想从其值中删除“:XYZ”字符,并在dbA中为另一列添加where语句。下面我显示我的代码为联接,但我不知道如何转换列的值。这允许我在连接中匹配idAidB。预先感谢一吨。SQL转换ID并在加入之前添加where语句

Select replace(idA, “:XYZ”, "") 
from dbA.TableA guid 
where event like “%2015” 
left join dbB.TableB own 
on guid.idA = own.idB 
+1

你会更换连接或必须使用子查询,以便在连接之前存在替换的值。 – xQbert

回答

4

事情很少

  1. FROM,加入,其中(除非您使用子查询)语法为了它也是执行的顺序(注意选择没有在操作的顺序列出其接近尾声但首先在语法上!)
  2. 当涉及多个表时,别名/完全限定列,因此我们知道哪个字段来自哪个表。
  3. 操作顺序让SQL执行from和JOINS 1st,因此您在select中做的操作对于编译器来说是不可用的(不在范围内),这就是为什么您不能使用select中的select列别名,哪里甚至是哪一组。
  4. 我不喜欢Select *通常,但因为我不知道你真的需要什么列......我在这里使用它。
  5. 就在加入之前。大多数SQL编译器都使用基于成本的优化,并根据数据表找出最佳执行计划以及不涉及的内容。所以只需将限制条件放在这种情况下,因为它限制了左连接的左表。如果您需要限制左连接右表上的数据,则您将限制连接条件;从而允许它在加入时进行过滤。
  6. 可能需要转换为IDA整数(或同一类型IDB)我用微调,以消除空间,但如果有其他非显示字符,你必须用左手问题加入匹配)

SELECT guild.*, own.* 
FROM dbA.TableA guid 
LEFT JOIN dbB.TableB own 
    on cast(trim(replace(guid.idA, ':XYZ', '')) as int) = own.idB 
WHERE guid.event like '%2015' 

,或者使用子查询,以便IDA在转化的状态在连接前先兑现改造(比如代数()的问题,并从里面得到处理)

SELECT * 
FROM (SELECT cast(trim(replace(guid.idA, ':XYZ', '')) as int) as idA 
     FROM dbA.TableA guid 
     WHERE guid.event like '%2015') B 
LEFT JOIN dbB.TableB own 
    on B.IDA = own.idB 
+0

感谢您的回复,并花时间解释过程。我尝试了两种方法,并在替换部分出现错误。我现在确定为什么。 – AlxRd

+0

IDA在tableA中是否正确?而IDA看起来像'123:XYZ',你想让它看起来像123? IDA和IDB都是相同的数据类型吗? (我猜没有,所以也许我们需要把一个转换为整数?最后,具体的错误是什么?以及哪个查询? – xQbert

+0

如果你可以提供一个guild.ida和一个在自己的idb和数据中匹配的这两个列的类型我们可能会想到这一点 – xQbert