【问题标题】:Alternative to *= for SQL Server 2012 [duplicate]SQL Server 2012 的 *= 替代方案 [重复]
【发布时间】:2013-12-25 13:27:39
【问题描述】:

在 SQL Server 2012 中是否可以使用 *= 进行查询?带有*= 的查询在 SQL Server 2008 和 SQL Server 2005 中工作正常,但在 SQL Server 2012 中不工作。

SELECT
  T.DOC_TYPE, T.DOC_NO, T.DOC_DATE, T.LR_NO, T.LR_DATE,
  T.DOC_REF, T.USER_ID, T.TRUCK_NO, P.PARTY_NAME,  TA.WBSLIP_NO, 
  TA.RATE, TA.SHORTAGE, TA.OTHER, TA.SERTAX, TA.PAPAMT, TA.BROK,
  I.IM_CHLQTY, I.IM_RXDQTY, I.IM_QTY, I.IM_REF,
  (SELECT PA.PARTY_NAME 
   FROM PARTYMST PA, TRINVS 
   WHERE TRINVS.DOC_TYPE = ?DOCTYPE 
     AND TRINVS.DOC_NO BETWEEN ?FDOCNO AND ?TDOCNO 
     AND PA.PARTY_ST + PA.PARTY_NO = TRINVS.TRNP_ST + TRINVS.TRNP_NO) TRNP_NAME
FROM 
  TRINVS T, TRINVSA TA, IMTRANS I, IMTRANSA IA, PARTYMST P 
WHERE
  T.DOC_TYPE = '   30' 
  AND T.DOC_NO = 'byrod125378' I.DOC_TYPE + I.DOC_NO = T.DOC_TYPE + T.DOC_NO 
  AND IA.DOC_TYPE + IA.DOC_NO = I.DOC_TYPE + I.DOC_NO 
  AND I.DOC_TYPE *= TA.DOC_NO 
  AND P.PARTY_ST + P.PARTY_NO = T.PARTY_ST + T.PARTY_NO 
ORDER BY 
  T.DOC_NO

我收到错误:

*= 附近的语法不正确。

为什么我不能在 SQL Server 2012 中使用 *= 进行联接?查询在 SQL Server 2008 和 SQL Server 2005 中运行良好。对于 SQL Server 2012,是否有任何替代 *= 的方法?

【问题讨论】:

  • 通常LEFT JOIN
  • ANSI / ISO SQL 标准 92(是的 - 1992 - 20 多年前!) - 任何关系数据库是使用INNER JOINLEFT OUTER JOIN
  • 我需要为每个字段使用左连接吗??
  • *= 适用于 w。 SQL Server 2008 仅在兼容模式下 (SQL 2000)。
  • 您可以将其用作正确连接语法的介绍:codinghorror.com/blog/2007/10/…。一旦你了解了基本概念,相信你就会明白如何使用它。

标签: sql sql-server sql-server-2008 sql-server-2005 sql-server-2012


【解决方案1】:

好的,我会尝试一下,虽然 *= 语法在将它们重写为 LEFT OUTER JOIN 时不是很明显,所以你真的想测试它是否等效;

...
FROM TRINVS T
INNER JOIN PARTYMST P      
  ON P.PARTY_ST + P.PARTY_NO = T.PARTY_ST + T.PARTY_NO
INNER JOIN IMTRANS I       
  ON I.DOC_TYPE + I.DOC_NO = T.DOC_TYPE + T.DOC_NO 
INNER JOIN IMTRANSA IA     
  ON IA.DOC_TYPE + IA.DOC_NO = I.DOC_TYPE + I.DOC_NO
LEFT OUTER JOIN TRINVSA TA 
  ON I.DOC_TYPE = TA.DOC_NO
WHERE T.DOC_TYPE = '   30' AND T.DOC_NO = 'byrod125378'
ORDER BY T.DOC_NO

作为一个令人遗憾的有点不完整的总结,您想要开始将连接条件从 WHERE 子句移动到 JOINON 子句是;

  • *= 比较应写为 LEFT OUTER JOIN,在 ON 子句中带有 = 比较。
  • =* 比较应重写为 RIGHT OUTER JOIN,并在 ON 子句中使用 = 比较。
  • = 不涉及左或右连接表的比较应重写为INNER JOIN,并将比较移至ON 子句。
  • = 涉及右连接或左连接表的比较通常移动到相应的 LEFT OUTER JOINRIGHT OUTER JOIN ON 子句,但这确实是映射不再直接的地方,可能需要进一步分析/测试等价的。

【讨论】:

  • 单独的JOIN 也可以写成(在我看来更清楚)INNER JOIN(并且LEFT JOIN 也可以拼写为LEFT OUTER JOIN - 这样就很清楚了从一开始你就使用INNEROUTER 加入这里)
  • 第二个@marc_s,由于OP是这个概念的新手,最好适当地向他们展示差异。
  • @marc_s 点了,虽然我个人觉得较长的语法更难阅读。
  • 我有一堆问题。这是一个示例查询。那么有没有标准的解决方案?
  • @neeldesai 我见过的最接近这方面的教程的是here(DOC 格式),但我不知道有什么工具能帮上忙。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-07
  • 1970-01-01
  • 2011-12-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多