Sql 左连接在“on”上返回语法错误
我有一个相当大的查询,我将只提供其中的一小部分。我在上收到一个语法错误 SplitAddresses.Client\u id=d\u Client.Client\u id:Sql 左连接在“on”上返回语法错误,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我有一个相当大的查询,我将只提供其中的一小部分。我在上收到一个语法错误 SplitAddresses.Client\u id=d\u Client.Client\u id: 我是否在语法上犯了一些明显的错误,还是有更深层次的问题?非常感谢您的帮助。看起来您给了d_客户机一个别名T,而没有在on语句中使用它。外部on结束前的结束括号适用,而不是您要与之一起使用的select。添加另一个结尾括号。下面是对SQL的重新格式化,这可能会使您的问题更加明确: ... left join (SELECT
我是否在语法上犯了一些明显的错误,还是有更深层次的问题?非常感谢您的帮助。看起来您给了d_客户机一个别名T,而没有在on语句中使用它。外部on结束前的结束括号适用,而不是您要与之一起使用的select。添加另一个结尾括号。下面是对SQL的重新格式化,这可能会使您的问题更加明确:
...
left join
(SELECT distinct
T.MLIS_CLIENT_ADDRESS_1,T.Client_id,
Left(T.MLIS_CLIENT_ADDRESS_1, IsNull(SplitAddresses.Pos - 1, 2147483647)) Address1,
Substring(T.MLIS_CLIENT_ADDRESS_1, SplitAddresses.Pos + 1, 2147483647) Address2
FROM
d_client
T
OUTER APPLY (
SELECT TOP 1 NullIf(PatIndex(Delimiter, T.MLIS_CLIENT_ADDRESS_1), 0) Pos
FROM (
VALUES ('% Suite %'), ('% Ste %'), ('% Bldg %'), ('% Building %'), ('%#%')
) SplitAddresses (Delimiter)
WHERE T.MLIS_CLIENT_ADDRESS_1 LIKE SplitAddresses.Delimiter
ORDER BY Pos
) SplitAddresses
on
SplitAddresses.Client_id=d_client.CLIENT_ID
WHERE...
看起来您缺少一秒钟的时间来完成以下操作:
left join
(
SELECT Distinct
T.MLIS_CLIENT_ADDRESS_1,
T.Client_id,
Left(T.MLIS_CLIENT_ADDRESS_1, IsNull(SplitAddresses.Pos - 1, 2147483647)) Address1,
Substring(T.MLIS_CLIENT_ADDRESS_1, SplitAddresses.Pos + 1, 2147483647) Address2
FROM
d_client T
OUTER APPLY
(
SELECT TOP 1
NullIf(PatIndex(Delimiter, T.MLIS_CLIENT_ADDRESS_1), 0) Pos
FROM
(
VALUES
('% Suite %'),
('% Ste %'),
('% Bldg %'),
('% Building %'),
('%#%')
) SplitAddresses (Delimiter)
WHERE
T.MLIS_CLIENT_ADDRESS_1 LIKE SplitAddresses.Delimiter
ORDER BY Pos
) SplitAddresses
on SplitAddresses.Client_id=d_client.CLIENT_ID
你应该发布整个查询。您对多级SplitAddresses和d_client上的表使用相同的别名,因此不清楚您是否正确地执行了特定的联接。但实际上,您在拆分地址后缺少一个和一个别名。它应该是这样的:SASplitAddresses@Lamak非常感谢你,你能回答我的问题吗?你的评论是对我问题的正确回答@耐心和制表键:这是我喜欢格式化我的SQL的方式,它使我的SQL更具可读性,并允许对嵌套进行轻松分析。@АСёаааааааааааааааааа1072,因此,它不会帮助他处理上面的sql语句块。@StefanH-没错,但它对未来是一个很好的资源:-。应在外部应用的括号后添加别名。应该是这样的:按Pos SA SplitAddresses订购。如果您在回答中添加了这一点,@Ачааааааааааааааme@Lamak更新,谢谢你指出这一点。但是别名是绝对必要的吗?我很少使用外部应用,所以我不确定嵌套选择中使用的是别名,我必须假设表在左连接开始之前没有别名
left join
(
SELECT Distinct
T.MLIS_CLIENT_ADDRESS_1,
T.Client_id,
Left(T.MLIS_CLIENT_ADDRESS_1, IsNull(SplitAddresses.Pos - 1, 2147483647)) Address1,
Substring(T.MLIS_CLIENT_ADDRESS_1, SplitAddresses.Pos + 1, 2147483647) Address2
FROM
d_client T
OUTER APPLY
(
SELECT TOP 1
NullIf(PatIndex(Delimiter, T.MLIS_CLIENT_ADDRESS_1), 0) Pos
FROM
(
VALUES
('% Suite %'),
('% Ste %'),
('% Bldg %'),
('% Building %'),
('%#%')
) SplitAddresses (Delimiter)
WHERE
T.MLIS_CLIENT_ADDRESS_1 LIKE SplitAddresses.Delimiter
ORDER BY Pos
) SplitAddresses
on SplitAddresses.Client_id=d_client.CLIENT_ID
left join
(
SELECT Distinct
T.MLIS_CLIENT_ADDRESS_1,
T.Client_id,
Left(T.MLIS_CLIENT_ADDRESS_1, IsNull(SplitAddresses.Pos - 1, 2147483647)) Address1,
Substring(T.MLIS_CLIENT_ADDRESS_1, SplitAddresses.Pos + 1, 2147483647) Address2
FROM
d_client T
OUTER APPLY
(
SELECT TOP 1
NullIf(PatIndex(Delimiter, T.MLIS_CLIENT_ADDRESS_1), 0) Pos
FROM
(
VALUES
('% Suite %'),
('% Ste %'),
('% Bldg %'),
('% Building %'),
('%#%')
) SplitAddresses (Delimiter)
WHERE
T.MLIS_CLIENT_ADDRESS_1 LIKE SplitAddresses.Delimiter
ORDER BY Pos
) SA
) SplitAddresses
on SplitAddresses.Client_id=d_client.CLIENT_ID