Sql 左连接在“on”上返回语法错误

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

我有一个相当大的查询,我将只提供其中的一小部分。我在上收到一个语法错误 SplitAddresses.Client\u id=d\u Client.Client\u id:


我是否在语法上犯了一些明显的错误,还是有更深层次的问题?非常感谢您的帮助。

看起来您给了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