按sem选择两个表之间不匹配的行

时间:2013-01-28 02:41:44

标签: sql join sql-server-2012

我有两个表,Table1和Table2。我想在Table2中选择Table1中未包含的不同行。这是一个例子:

  Table1        

   | A  |   | sem|
   ------------------
1. | aa |   | 1 |
   ---------------
2. | bb |   | 1 |
   ----------------
3. | aa |   | 2 |
   -----------------
4. | cc |   | 2 |
   ---------------

Table2

   | B  |
   ------
1. | aa |
   ------
2. | aa |
   ------
3. | bb |
   ------
4. | cc |
   ------
5. | cc |
   ------
6. | ee |
   ------
7. | ee |
   ------

当sem = 1时,我想要在这两个表中不常见的那一行 喜欢 输出sem = 1   结果

| B |

  1. | cc |
  2. | ee |

3 个答案:

答案 0 :(得分:8)

你可以尝试这样的事情。

SELECT B
FROM Table2 b
WHERE NOT EXISTS (
    SELECT *
    FROM Table1 a
    WHERE a.A = b.B)

从我可以收集的内容来看,你的工作不起作用的原因是因为你得到了table1和table2中所有的值。你应该做的就像我上面所做的那样。获取两个表中的所有值并检查两个表中的哪些值不在结果集中,这就是我设置子查询的原因。我的SQL上有点生疏,所以拿着我所说的,加盐。

答案 1 :(得分:6)

您可以使用outer joinwhere子句执行此操作。在这种情况下,我认为右外连接:

SELECT cd.cGenotype
FROM  dbo.TestResults tr right outer join
      dbo.CombinedData cd
      ON (tr.TestResult = cd.cGenotype)
where tr.testresult is null
GROUP BY cd.cGenotype

答案 2 :(得分:1)

SELECT DISTINCT b.cGenotype
FROM  dbo.CombinedData b 
WHERE NOT EXISTS (SELECT * 
                  FROM dbo.TestResults a 
                  WHERE a.TestResult = b.cGenotype)