SQL Server 2012中LEFT OUTER JOIN的SQL语法

Ste*_*ber 7 sql t-sql sql-server sql-server-2012

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

任何人都可以告诉我SQL Server 2012的正确语法是什么,以下SQL在SQL Server 2008上正常工作?

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
Run Code Online (Sandbox Code Playgroud)

Tar*_*ryn 19

为什么不使用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
Run Code Online (Sandbox Code Playgroud)

  • @devio我认为为了清晰起见,过滤条件应该在'WHERE'上.当你说如果在`JOIN`条件下更改它们将避免多余的记录,优化器很可能会为两个查询执行相同的计划.哦,祝贺开发Oracle!;-) (3认同)
  • 另外,您还可以将WHERE条件移动到相应的JOIN子句中,以避免以后由WHERE消除的多余记录 (2认同)