【问题标题】:SQL 2000 to SQL 2008SQL 2000 到 SQL 2008
【发布时间】:2023-03-16 05:18:01
【问题描述】:

我在 SQL 2000 数据库中有一个查询,我需要将它迁移到 SQL 2008 数据库。它在 SQL2000 中运行良好,我不需要将其修改为 SQL2008。下面是SQL2000中的查询。请指导我如何在 ON 子句中重载 *==* 子句。

SELECT tblacc. *
FROM   tblacc,
       tblst,
       tblreceipt,
       tblrtemp,
       tblitem
WHERE  tblacc.rkey = tblreceipt.rkey
       AND tblacc.stkey = tblst.stkey
       AND tblacc.stkey *= tblrtemp.stkey
       AND tblacc.stkey *= tblitem.stkey
       AND tblacc.itkey *= tblitem.itkey
       AND tblrtemp.rkey =* tblreceipt.rkey 

【问题讨论】:

    标签: sql tsql sql-server-2008 sql-server-2000


    【解决方案1】:

    *= 是左连接

    =* 是右连接

    您是否尝试在 SQL Server Management Studio 的 SQL 编辑器中显示它? 它可能会为您转换它。

    【讨论】:

    • 好建议我刚试过select * from master..spt_values v1, master..spt_values v2 WHERE v1.number *= v2.number点击“编辑器中的设计查询”,它确实重写了它。显然在某些情况下the old style syntax is ambiguous 所以不确定它是如何处理这些的。
    • 它似乎不喜欢 OP 的查询。
    【解决方案2】:
    SELECT tblacc.*
    FROM   tblacc
      INNER JOIN tblreceipt ON tblacc.rkey = tblreceipt.rkey
      INNER JOIN tblst      ON tblacc.stkey = tblst.stkey
      LEFT JOIN  tblitem    ON tblacc.stkey = tblitem.stkey
                           AND tblacc.itkey = tblitem.itkey
      LEFT JOIN  tblrtemp   ON tblacc.stkey = tblrtemp.stkey
                           AND tblrtemp.rkey = tblreceipt.rkey
    

    【讨论】:

      【解决方案3】:

      不幸的是,“在 ON 子句中重载 *==* 子句”的意思还不是很清楚。但是,我可以看到一个问题:您正在使用旧式语法进行外连接。您应该将此语法替换为the new "ANSI SQL" syntax。这使用关键字而不是*==*,并将连接条件移动到FROM 子句中:

      • WHERE a.x *= b.y 变为 FROM a LEFT OUTER JOIN b ON a.x = b.y
      • WHERE a.x =* b.y 变为 FROM a RIGHT OUTER JOIN b ON a.x = b.y
      • 还有FROM a FULL OUTER JOIN b ON a.x = b.y,它用空值填充either表中不匹配的元组。

      旧语法has been deprecated since SQL Server 2005 因为它是非标准的并且容易引入歧义。它是not available on databases running in SQL Server 2005 or later 兼容模式,这可能是您的问题的根源。

      【讨论】:

        【解决方案4】:

        我相信查询应该类似于下面的内容,但我不知道您是否想对表 tblreceipt 执行 INNER JOINRIGHT JOIN

        SELECT tblacc.*
        FROM   tblacc
        JOIN   tblreceipt
            ON tblacc.rkey = tblreceipt.rkey
        JOIN   tblst
            ON tblacc.stkey = tblst.stkey
        LEFT JOIN tblrtemp
            ON tblacc.stkey = tblrtemp.stkey
        LEFT JOIN tblitem
            ON tblacc.stkey = tblitem.stkey AND tblacc.itkey = tblitem.itkey
        RIGHT JOIN tblreceipt
            ON tblrtemp.rkey = tblreceipt.rkey 
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-12-18
          • 2011-09-20
          • 1970-01-01
          • 1970-01-01
          • 2013-02-08
          • 1970-01-01
          • 2011-11-20
          • 2010-12-17
          相关资源
          最近更新 更多