-4

假设我有 3 个表,每个表都有一个 field foo。我如何获得以下记录:

  1. 所有 3 个表中都存在 foo 值的所有记录?
  2. 任意 2 个表中存在 foo 值的所有记录?
  3. foo 的值仅存在于 1 个表中的所有记录?

foo是独特的。

我对#1的尝试:

SELECT a.foo
FROM   a
WHERE  a.foo IN (SELECT b.foo
                 FROM   b
                 WHERE  b.foo IN (SELECT c.foo
                                  FROM   c)) 

对于#2,我认为我需要做一些类似于#1 的事情,但是一次对 2 个表 {a,b}, {b,c}, {a,c} - 然后 UNION 呢?没有把握。

对于#3,没有线索。

更新:示例数据

Table1
 - foo-a
 - foo-b
 - foo-c

Table2
 - foo-a
 - foo-b

Table3
 - foo-a
 - foo-c
 - foo-d

对于 #1 问题,所有 3 个表中都存在 1 条记录:foo-a。对于#2 问题,2 个表中存在 2 条记录:foo-b(在 Table1 和 Table2 中)和 foo-c(在 Table1 和 Table3 中)。对于 #3 问题,只有 1 个表中存在 1 条记录:foo-d。

4

3 回答 3

4

既然FOO是独一无二的,

对于 1 号,

SELECT Foo
FROM
    (
        SELECT Foo FROM table1
        UNION ALL
        SELECT Foo FROM table2
        UNION ALL
        SELECT Foo FROM table3
    ) a
GROUP BY Foo
HAVING COUNT(*) = 3

对于 2 号,

SELECT Foo
FROM
    (
        SELECT Foo FROM table1
        UNION ALL
        SELECT Foo FROM table2
        UNION ALL
        SELECT Foo FROM table3
    ) a
GROUP BY Foo
HAVING COUNT(*) = 2

对于 3 号,

SELECT Foo
FROM
    (
        SELECT Foo FROM table1
        UNION ALL
        SELECT Foo FROM table2
        UNION ALL
        SELECT Foo FROM table3
    ) a
GROUP BY Foo
HAVING COUNT(*) = 1
于 2012-11-01T10:45:29.300 回答
2

试试这个:如果值为Cont1 则该值仅存在于一个表中,如果值为 2 则它存在于两个表中,依此类推。

SELECT foo, COUNT(1) Cont
  FROM 
  (
  SELECT foo
    FROM  a
    UNION
  SELECT foo
    FROM  b
    UNION
 SELECT foo
    FROM  c 
  ) a
  GROUP BY foo
  --   HAVING COUNT(1) = 1 -- 2 FOR EXISTING IN TWO TABLES, 3 FOR EXISTING IN ALL TABLES
于 2012-11-01T10:44:35.183 回答
0

对于可以获取具有计数的所有项目的单个 SQL,或者(使用 HAVING 子句)如果需要任何单独的项目:-

SELECT a.foo, COUNT(*)
FROM (SELECT foo
FROM  a
UNION
SELECT foo
FROM  b
UNION
SELECT foo
FROM  c) AS z
LEFT OUTER JOIN a ON a.foo = z.foo
LEFT OUTER JOIN b ON b.foo = z.foo
LEFT OUTER JOIN c ON c.foo = z.foo
GROUP BY z.foo
于 2012-11-01T11:23:08.223 回答