【问题标题】:How to replace an IN statement in SQL Server?如何替换 SQL Server 中的 IN 语句?
【发布时间】:2015-02-14 20:13:03
【问题描述】:

我正在尝试重写以下查询(不是我自己创建的),因为这会引发执行错误:

旧查询:

        SELECT LastName + ', ' + FirstName AS 'Teamleader'
        FROM dbo.EmpTable
        WHERE EmpID IN (
                SELECT SupEmpID
                FROM dbo.EmpTable
                WHERE 
                SupEmpID = (
                                SELECT EmpID 
                                FROM EmpTable 
                                WHERE SupEmpID = (
                                                SELECT EmpID 
                                                FROM EmpTable 
                                                WHERE NTID = @NTID
                                                )
                                )
                        )
        ORDER BY TeamLeader

我曾想过使用 JOIN 而不是嵌套查询,但我不确定在涉及 IN 语句时如何应用它。 到目前为止,我有以下内容,但这会返回相同的错误(可能是因为我仍然有 IN 语句)。

新查询(尝试):

            SELECT      A.LastName + ', ' + A.FirstName AS TeamLeader
            FROM        dbo.EmpTable AS A
            WHERE       A.EmpID IN
                        (
                            SELECT      D.SupEmpID
                            FROM        dbo.EmpTable AS B
                            INNER JOIN  dbo.EmpTable AS C
                            ON          C.SupEmpID = B.EmpID
                            INNER JOIN  dbo.EmpTable AS C
                            ON          D.SupEmpID = C.EmpID
                            WHERE       B.NTID = @NTID
                        )
            ORDER BY TeamLeader

有人能解释一下这里的 IN 语句,让我知道我可以做些什么来解决这个问题吗?

【问题讨论】:

  • 你为什么要重写它?它不会给您预期的结果,还是您只是不喜欢/不理解它?
  • 您可以通过将所有= (<subquery>) 替换为in (<subquery>) 来修复执行错误。此外,编辑您的问题并包含您遇到的实际错误。
  • 所以查询抛出了错误,但是你没有告诉我们错误信息,以免我们用不必要的细节混淆?
  • 您似乎正试图通过提供记录的NTID 来获取第三级父母的名字和姓氏。如果是这样,可以使用CTE 来完成。您能否分享您的查询的示例数据和预期输出,以便我们更好地理解它?

标签: sql sql-server select stored-procedures sql-order-by


【解决方案1】:

IN 可能是这里最好的解决方案。 IN 将返回“外部”表中的所有记录,其中内部表(或子查询)中有匹配的记录。

如果您执行JOIN,则外部表的记录将与内部表中的记录配对,因此您可能会得到多个结果,如果内表中有多个匹配项。您可以对结果执行 DISTINCT 以消除重复项,但 IN 可能会更快,因为它不必匹配所有记录然后消除重复项。 p>

【讨论】:

    【解决方案2】:

    如果您没有两个别名为 C 的表,您的最后一个查询可能会起作用:

    SELECT      A.LastName + ', ' + A.FirstName AS TeamLeader
                FROM        dbo.EmpTable AS A
                WHERE       A.EmpID IN
                            (
                                SELECT      D.SupEmpID
                                FROM        dbo.EmpTable AS B
                                INNER JOIN  dbo.EmpTable AS C
                                ON          C.SupEmpID = B.EmpID
                                INNER JOIN  dbo.EmpTable AS D
    --------------------------------------------------------^
                                ON          D.SupEmpID = C.EmpID
                                WHERE       B.NTID = @NTID
                            )
                ORDER BY TeamLeader
    

    【讨论】:

      【解决方案3】:

      尝试LIKE 语句,因为如果 ID 是字符串值,那将是最佳做法。

      【讨论】:

        【解决方案4】:

        在第二个查询中修复了明显的别名问题后,您可以使用更优雅的 CTE:

        ;WITH ids as (
            SELECT      D.SupEmpID
            FROM        dbo.EmpTable AS B
            INNER JOIN  dbo.EmpTable AS C1 ON C1.SupEmpID = B.EmpID
            INNER JOIN  dbo.EmpTable AS C2 ON D.SupEmpID = C2.EmpID
            WHERE       B.NTID = @NTID
        )
        SELECT      A.LastName + ', ' + A.FirstName AS TeamLeader
        FROM        dbo.EmpTable AS A
        INNER JOIN ids ON ids.SupEmpID = A.EmpID
        ORDER BY TeamLeader
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-08-27
          • 1970-01-01
          • 2011-05-01
          • 2015-03-10
          • 1970-01-01
          • 1970-01-01
          • 2011-05-27
          相关资源
          最近更新 更多