从具有相同列的2个表中计数(*)

时间:2012-07-06 14:32:11

标签: sql oracle

我手头有一个奇怪的问题,我确信我在SQL上非常糟糕。

问题如下:

我有2个表table1和table2。两个表都有相同的列集,即ID号,X号,Y号。这里X和Y的值为0或1.

现在说例如表1中的ID范围为1-100,表2中的范围为91-200:在表1中,X表示所有100行的值为1,而在同一表中,Y的值仅为90表示1.接下来的10个Y值91到100表示​​在表2中。

现在,为各种查询调用count(*)表示X = 1且Y = 1,X = 1且Y = 0等我没有得到正确的值,因为table2中存在一些Y值。我在看左边加入,但不知怎的,我无法弄清楚这是否是正确的方法。

Table1
-------
Id X Y
1  1 1 
2  1 1 
3  1 1 
4  1 0 
5  1 0



Table2
-------
Id X Y
4  0 1
5  0 1
6  0 0
7  0 0
8  0 0
9  1 1

所以,如果我说X = 1且Y = 1,我应该得到5作为计数(*)。

嗨,贾斯汀, 让我解释一下实际情况。考虑3个进程p1,p2和p3,它们具有缓存,其中P1,P2和P3只是X,Y和Z列。此缓存的内容只是ID的内容。如果p1转储和Id 1,我会说ID = 1的X = 1等等。这些进程中的每一个都将缓存转储到一个组中,例如g1和g2。我创建了一个关于g1和g2的表。所以g1代表table1,g2代表table2。 p1,p2和p3中的每一个都具有倾倒100个ID的限制。 P1有可能在g1(table1)中转储ID为1-100,其中p2在g1(table1)中只丢弃了90,而在g2(table2)中只剩下10,类似p3会说在g1(table1)中倾倒95并且休息g2中的5(表2)。然而,p1,p2和p3中的每一个都倾倒了100个ID但是在不同的组中。现在,如果我想在理想的情况下得到一个计数(),当所有的P1,P2和P3都在g1中转储缓存时,我会说从g1获取max(id),其中P1 = 1,同样min(id) )来自g1,其中P1 = 1。我会写一个查询说“从g1选择计数(),其中X = 1,Y = 1,Z = 1,其中ID介于g1的min(id)和g1的max(id)之间。它会返回100.但是在当前情况下它会返回90,这是不正确的。所以要解决这个问题,我还必须考虑g2(table2)中存在的ID。

我希望这能回答你的问题。

由于 MAV

2 个答案:

答案 0 :(得分:4)

在应用谓词之前,您似乎想要将两个表放在一起UNIONUNION ALL。像

这样的东西
SELECT COUNT(*)
  FROM (SELECT id, x, y
          FROM table1
        UNION ALL
        SELECT id, x, y
          FROM table2)
 WHERE x = 1
   AND y = 1;

UNION ALL将返回两个表中的每一行。 UNION将消除重复的行。

如果这不是您想要的,那么通过一个示例来说非常有帮助,您可以在每个表中创建几行示例数据,并向我们展示您想要的结果以及如何获得该结果。

答案 1 :(得分:0)

SELECT COUNT(*)
FROM
(SELECT ID, MAX(X) X, MAX(Y) Y
FROM
(SELECT *
FROM TABLE1
UNION ALL
SELECT *
FROM TABLE2)
GROUP BY ID)
WHERE X = 1 AND Y = 1

或者,如果您想使用高级group by子句

SELECT COUNT(*)
FROM
(SELECT *
FROM TABLE1
UNION ALL
SELECT *
FROM TABLE2)
HAVING MAX(X) = 1 AND MAX(Y) = 1
GROUP BY ID