2016-09-28 34 views
0

我在SQL中有2个表。查询表2中找到缺失值的2个表的查询

- 表1-

  • 名称
  • ID

- 表2-

  • ID

  • 方案

表1只为每家公司保存一条记录。在表2中,表1中的记录可以有多个条目。因此,我可以将两个表一起加入ID = ID,并获得0到7个结果中的任意位置。我需要查询2表,我正在寻找表1中任何不在特定程序中的公司,但他们可以在其他程序中。我知道这很容易做到,但我无法让它为我工作。

+1

能否请你少用抽象的名字,并分享一些样本数据与预期的结果为你的表?我无法遵循你想要做的事。 – Siyual

+0

我觉得在他的输入中有具体的程序。\ – Naidu

+0

加入后做个where条件。在哪里table2.program不等于程序,ID – Naidu

回答

0
SELECT t1.Name 
    FROM Table1 t1 
LEFT JOIN 
     Table2 t2 
    ON t1.id = t2.id 
WHERE t2.program IS NULL; 
+0

t2没有名称字段,它确实有程序。但是这会让你的程序注册公司的ID与公司表不符,这与被问到的是相反的。 – Matt

+0

现在,它将获得没有注册到任何程序的公司,在您进行下一次编辑时,您可能只需要我的答案 – Matt

1
SELECT * 
FROM 
    Table1 t1 
    LEFT JOIN Table2 t2 
    ON t1.id = t2.id 
    AND t2.program = 'asdf' 
WHERE 
    t2.id IS NULL 

只需使用一个外连接的地方连接条件的程序要求,然后说其中对于表2的记录不存在。

试图让这一点更加明确和适应您的具体企业和项目:

SELECT * 
FROm 
    Companies c 
    LEFT JOIN Programs p 
    ON c.Id = p.CompanyId 
    AND p.Program = 'some title' 
WHERE 
    p.Program IS NULL 

而且不存在方法:

SELECT * 
FROM 
    Companies c 
WHERE 
    NOT EXISTS (SELECT 1 
      FROM Programs p 
      WHERE 
       p.CompanyId = c.Id 
       AND p.Program = 'some title') 

我不要在方法显示NOT因为我通常不会推荐它。

+0

这一项适用于我正在寻找的内容。谢谢。 – Jayson

+0

@Jayson很高兴为您解决问题,并乐于提供帮助,请考虑接受我的答案或其他人的帮助,以便其他人知道您的问题已经得到了处理并且分配了名誉点。谢谢! http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work – Matt

0

您想让公司找不到您在查询中指定的程序吗?这是我想出了:

select t1.* 
from Table1 t1 
left join Table2 t2 on t1.ID = t2.ID 
where coalesce(t2.Program, '') <> 'Name of Program' 

where coalesce(t2.Program, '') not in (<comma-delimited list of programs>)