代码之家  ›  专栏  ›  技术社区  ›  sharptooth

如何从一个表中选择项,以便另一个表的查询只产生一行?

  •  1
  • sharptooth  · 技术社区  · 12 年前

    我有两张桌子: Jobs JobItems :

    CREATE TABLE Jobs (
        [JobId] UNIQUEIDENTIFIER NOT NULL PRIMARY KEY
    );
    
    Create TABLE JobItems(
        [ItemId] UNIQUEIDENTIFIER NOT NULL,
        [JobId] UNIQUEIDENTIFIER NOT NULL
    );
    

    以及 乔布斯 中可以有零行、一行或多行 工作项目 这样他们 JobId 与中的行匹配 乔布斯 这意味着零个、一个或多个“作业”包含该“项目”。

    我需要从中选择行 乔布斯 这样正好有一行 工作项目 具有 作业ID 与中的行匹配 乔布斯 并尝试了来自的代码 this answer (改变了一点):

    SELECT JobId, (SELECT Count(ItemId) from JobItems WHERE
         JobItems.JobId=Jobs.JobId) from Jobs
    

    问题是我现在需要说,我只需要一个匹配的行。所以我尝试为 Count(ItemId)

    SELECT JobId, (SELECT Count(ItemId) AS CountItemId from JobItems WHERE
         JobItems.JobId=Jobs.JobId) from Jobs WHERE CountItemId=1
    

    但这让SQL server不高兴——它说

    列名称无效 CountItemId

    如何仅选择一个匹配项?

    5 回复  |  直到 9 年前
        1
  •  2
  •   Mudassir Hasan    12 年前

    A基础 GROUP BY HAVING 子句将为您做这件事。。

          SELECT Jobs.jobId
          FROM Jobs 
          INNER JOIN JobItems
             ON Jobs.JobId = JobItems.JobId
          GROUP BY Jobs.jobId
          HAVING COUNT(*)=1
    
        2
  •  1
  •   Thorsten Kettner    12 年前

    您可以这样做:

    select *
    from jobs i
    where (select count(*) from jobitems ji where ji.jobid = j.jobid) = 1;
    

    但是,如果表Jobs只包含所有作业ID,而不包含其他任何内容,那么您根本不必从表Jobs中选择:

    select jobid
    from jobitems 
    group by jobid
    having count(*) = 1;
    
        3
  •  1
  •   Code Lღver    12 年前

    使用此查询:

    SELECT JobId, Count(ItemId) from JobItems group by JobId;
    
        4
  •  1
  •   Madara Uchiha    12 年前
    Select jobid
    From jobitems 
    Group by jobid
    Having count(*) = 1;
    
        5
  •  1
  •   dbetke    12 年前

    也可以创建临时结果集:

    WITH T1 AS (
      SELECT JobId
      FROM Jobs 
    ),
    T2 AS (
      SELECT JobId, Count(ItemId) AS CountItemId 
      FROM JobItems 
      GROUP BY JobID
    )
    
    SELECT JobId, CountItemId
    FROM T2
    WHERE CountItemId = 1