【问题标题】:How can I join a table to another to do a select conditional upon a value in a column in the second table?如何将一个表连接到另一个表以根据第二个表中的列中的值进行选择?
【发布时间】:2026-01-03 19:55:01
【问题描述】:

我有一个考试表和一个查询以获取考试列表:

CREATE TABLE [dbo].[Exam] (
    [ExamId]       INT            IDENTITY (1, 1) NOT NULL,
    [Title]        NVARCHAR (50)  NULL,
    CONSTRAINT [PK_Exam] PRIMARY KEY CLUSTERED ([ExamId] ASC)
);

SELECT   Exam.ExamId           AS ExamId,
         Exam.Title            AS Name
FROM     Exam

我真正需要的是修改这个查询,以便它只显示还有一个 TestStatusId = 3 的测试的考试。我知道我可以通过普通连接加入这些表,但我会得到每个测试的许多考试行。我只需要查看一个或多个 TestStatusID = 3 的考试的 Exam.ExamId 和 Exam.Title。

CREATE TABLE [dbo].[AdminTest] (
    [AdminTestId]  INT            IDENTITY (1, 1) NOT NULL,
    [Title]        NVARCHAR (100) NOT NULL,
    [TestStatusId] INT            NOT NULL,
    [ExamId]       INT            NOT NULL,
    CONSTRAINT [PK_AdminTest] PRIMARY KEY CLUSTERED ([AdminTestId] ASC))
)

有人可以告诉我如何使用 SELECT 连接这两个表来完成我需要的操作吗?

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    有几种方法可以做到这一点,我更喜欢使用EXISTS

    SELECT   E.ExamId   AS ExamId,
             E.Title    AS Name
    FROM     Exam E
    WHERE EXISTS (
        SELECT 1
        FROM AdminTest A
        WHERE A.ExamId = E.ExamId AND
              A.TestStatusID = 3)
    

    或者,您可以使用IN

    SELECT   ExamId    AS ExamId,
             Title     AS Name
    FROM     Exam 
    WHERE ExamId IN (
        SELECT ExamId
        FROM AdminTest
        WHERE TestStatusId = 3
    )
    

    【讨论】:

      【解决方案2】:

      您可以使用EXISTS 如另一个答案所示,您也可以将TestStatusID = 3 添加到您的JOIN

      SELECT   e.ExamId           AS ExamId,
               e.Title            AS Name
      FROM     Exam e
      JOIN     AdminTest a
        ON  e.ExamID = a.ExamID
        AND a.TestStatusId = 3
      

      或在WHERE 子句中过滤:

      SELECT   e.ExamId           AS ExamId,
               e.Title            AS Name
      FROM     Exam e
      JOIN     AdminTest a
        ON  e.ExamID = a.ExamID
      WHERE a.TestStatusId = 3
      

      【讨论】:

      • join 的问题是 OP 想要 distinct 结果。 Exists 应该比使用 select distinct 表现更好。
      • @sgeddes 实际上EXISTS 通常是最有效的。 IN 通常是性能最差的方法,在我看来,将它们全部展示出来是有意义的。
      • 我认为当前的 sql server 引擎优化器实际上对待 inexists 是一样的,但我更喜欢 existsselect distinct 虽然做了完全不同的操作。话虽如此,我同意展示所有潜在的解决方案是有益的。
      【解决方案3】:

      最好的方法可能是使用INNER JOIN

      SELECT     Exam.ExamId,
                 Title AS Name
      FROM       Exam
      INNER JOIN AdminTest ON AdminTest.ExamId = Exam.ExamId
      WHERE      TestStatusId = 3
      

      您可能还想在 AdminTest.ExamId 列上创建一个foreign key

      【讨论】:

      • join 的问题是 OP 想要 distinct 结果。 Exists 应该比使用 select distinct 表现更好。
      最近更新 更多