如何在SQL Server中重写旧连接语法* =

时间:2015-12-18 13:24:06

标签: sql-server legacy-code

我正在尝试用新标准重写旧连接语法。

SELECT count(*)
FROM es_dbo.tablTypes t
    ,es_dbo.tablReg r
    ,es_dbo.tabl_PRGandCLI p
WHERE t.ClientType *= r.ClientType
    AND p.ID IN (
        SELECT DISTINCT ClientID
        FROM esinet_dbo.tablReG
        )
    AND t.ClientType IN (@intClientType)

这是我正在尝试的。

SELECT count(*)
FROM es_dbo.tablTypes t
LEFT JOIN es_dbo.tablReg r ON t.ClientType = r.ClientType
LEFT JOIN es_dbo.tabl_PRGandCLI p ON p.ID IN (
        SELECT DISTINCT ClientID
        FROM es_dbo.tablReG
        )

我在查询的第二部分中使用LEFT JOIN或INNER JOIN是否记录相同的记录。任何人都可以解释

2 个答案:

答案 0 :(得分:0)

尝试以下方法:

SELECT count(*)
FROM es_dbo.tablTypes t
    left join es_dbo.tablReg r on t.ClientType = r.ClientType
WHERE t.ClientType IN (@intClientType)
   EXISTS (SELECT 1 FROM esinet_dbo.tablReG p WHERE r.ClientID = p.ID)

1)我假设@intClientType是一个标量值,所以不需要IN

2)检查存在时删除了DISTINCT和子查询。 EXISTS应该更快,因为它涉及找到第一个元素,而不是为DISTINCT做一些排序。

根据{{​​3}}的讨论,

3)* =被LEFT JOIN取代。

答案 1 :(得分:0)

根据查询,它既不是内连接也不是左连接,它似乎是交叉连接,因此您可以使用以下查询:

SELECT count(*)
FROM es_dbo.tablTypes t
LEFT JOIN es_dbo.tablReg r ON t.ClientType = r.ClientType,
es_dbo.tabl_PRGandCLI p WHERE p.ID IN (
    SELECT DISTINCT ClientID
    FROM es_dbo.tablReG
    )