2017-05-25 170 views
0

我的任务是在与SQLite兼容的SQL Server存储过程中进行查询。将左连接转换为左连接

以下查询包含RIGHT JOIN s,这是不兼容的SQLite:

SELECT ...  
FROM Operatori 
INNER JOIN Preventivi 
    ON Operatori.Pk = Preventivi.FkOperatori 
RIGHT JOIN Operatori AS Operatori_1 
INNER JOIN Soluzioni 
    ON Operatori_1.Pk = Soluzioni.FkOperatore 
INNER JOIN Reparti 
    ON Operatori_1.FkReparto = Reparti.Pk 
RIGHT JOIN Progetti 
INNER JOIN Anagrafica 
    ON Progetti.FkClienti = Anagrafica.Pk 
    AND Soluzioni.FkProgetti = Progetti.Pk 
    AND Preventivi.FkSoluzioni = Soluzioni.Pk 

我所知道的是,通常情况下,切换表的工作原理:

前。

FROM Operatori 
    RIGHT JOIN Progetti 

变成了:

FROM Progetti 
    LEFT JOIN Reparti 

但我怎么可以做转换,如果我在同一个查询有其他JOIN S'

+0

什么是原始数据库? 'RIGHT JOIN'通常伴随着一个条件,就像'LEFT JOIN'是...这两个应该是相等的,只是以相反的顺序。没有条件的'RIGHT JOIN'看起来像SQL的一些特定于数据库的扩展。 – jpmc26

+0

@ jpmc26这是一个SQLServer内部的存储过程,不幸的是我无法提供更多关于它的信息,因为我是新手,并且没有创建存储过程。而那个做的不在这里了。 :( –

+1

我已经做了一些澄清,请检查并确保我没有改变你的意图 – jpmc26

回答

1

与内部联接相比,外部联接为不匹配的表行返回附加结果行。 但是,这仅适用于与该连接的ON子句进行的匹配。 所以这个查询实际上并没有任何外部联接是否有意义,因为

  • 两个右连接没有ON子句,所以有没有可能被特殊处理的匹配;和
  • 即使在两个外连接上有ON子句,它们后面跟着匹配列上的内连接,因此这些列中具有NULL的任何行都会被内连接过滤掉。

因此,在此查询中,您可以简单地用INNER(在两个数据库中)替换RIGHT,结果保证是相同的。

+0

非常感谢! –