【问题标题】:SQL syntax for LEFT OUTER JOIN in SQL Server 2012SQL Server 2012 中 LEFT OUTER JOIN 的 SQL 语法
【发布时间】:2012-11-20 21:27:53
【问题描述】:

由于缺乏对 *= (LEFT OUTER JOIN) 运算符的支持,我们遇到了 SQL Server 2012 的问题。

谁能告诉我以下在 SQL Server 2008 上正常运行的 SQL 的 SQL Server 2012 的正确语法是什么?

SELECT 
    t7410.name, t7408.type, t7410.length, 
    t7410.status, t7410.prec, t7410.scale, 
    t7409.type 
FROM 
    dbo.syscolumns t7410, dbo.systypes t7408, 
    dbo.sysobjects t7409, dbo.sysusers t7411, 
    master.dbo.syslogins t7412 
WHERE 
    t7410.id = t7409.id 
    AND t7411.uid = t7409.uid 
    AND t7409.name = 'GENERAL'
    AND t7409.type IN ('U', 'S', 'V') 
    AND t7410.usertype *= t7408.usertype 
    AND t7412.sid = t7411.sid 
    AND t7412.name = user_name() 
ORDER BY 
    t7410.colid ASC

【问题讨论】:

  • 哦,我什至不知道你能做到这一点。
  • 默认情况下它们在 SQL 2000 中是不允许的?我上次使用它们是 Sql Server 6.0!
  • Bad habits to kick : using old-style JOINs - ANSI-92 SQL 标准不再使用这种旧式“逗号分隔的表列表”样式。 ..
  • 您还应该使用 sys.columns、sys.users、sys.types 等。您现在使用的这些向后兼容视图仅用于向后兼容 - 而对象的 uid 并没有甚至与上次这些视图有效时的含义相同(SQL Server 2000)。

标签: sql sql-server tsql sql-server-2012


【解决方案1】:

为什么不用 ANSI JOIN 语法来写这个:

SELECT t7410.name, t7408.type, t7410.length, 
    t7410.status, t7410.prec, t7410.scale, 
    t7409.type 
FROM dbo.syscolumns t7410
INNER JOIN dbo.sysobjects t7409
    ON t7410.id = t7409.id
INNER JOIN dbo.sysusers t7411
    ON t7411.uid = t7409.uid 
INNER JOIN master.dbo.syslogins t7412 
    ON t7412.sid = t7411.sid 
LEFT JOIN dbo.systypes t7408
    ON t7410.usertype = t7408.usertype 
WHERE t7409.name = 'GENERAL'
    AND t7409.type IN ('U', 'S', 'V') 
    AND t7412.name = user_name() 
ORDER BY t7410.colid ASC

【讨论】:

  • 另外,您还可以将 WHERE 条件移动到相应的 JOIN 子句中,以避免随后被 WHERE 消除的多余记录
  • @devio 同意,我只是想把它变成 ansi 语法。
  • @devio 我认为过滤条件应该在WHERE 上为清楚起见。当您说如果它们在JOIN 条件上被更改,它将避免多余的记录,优化器很可能会为两个查询执行相同的计划。哦,恭喜您开发了 Oracle! ;-)
猜你喜欢
  • 2010-09-29
  • 1970-01-01
  • 2014-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-10
  • 2014-07-05
相关资源
最近更新 更多