1

我手头有一个奇怪的问题,我确信我的 SQL 很糟糕。

问题如下:

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

现在假设 ID 范围为 table1 中的 1-100,范围为 table2 中的 91-200:在 table1 中,X 具有所有 100 行的值,例如 1,而在同一个表中,Y 仅具有 90 行的值,例如 1。接下来的 10 个 Y 值(即 91-100)在表 2 中。

现在,为各种查询调用 count(*),例如 X=1 和 Y=1、X=1 和 Y=0 等,我没有得到正确的值,因为 table2 中存在一些 Y 值。我正在查看 left Join 但不知何故我无法弄清楚这是否是正确的方法。

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 我会说 X=1 对于 ID=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 并休息5 在 g2(表 2)中。然而,p1、p2 和 p3 中的每一个都转储了 100 个 id,但在不同的组中。现在,如果我想计数() 在理想情况下,当所有 P1、P2 和 P3 都在 g1 中转储缓存时,我会说从 P1=1 的 g1 中获取 max(id),从 ​​P1=1 的 g1 中获取类似的 min(id)。我会写一个查询说“从 g1 中选择 count(),其中 X=1 和 Y=1 和 Z=1,其中 ID 介于 g1 的 min(id) 和 g1 的 max(id) 之间。在理想情况下,它会有返回 100。但在当前情况下,它返回 90,这是不正确的。所以为了解决这个问题,我还必须考虑 g2(table2) 中存在的 ID。

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

谢谢马夫

4

2 回答 2

4

听起来您想在应用谓词之前UNION或将两个表放在一起。UNION 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将消除重复的行。

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

于 2012-07-06T14:47:25.197 回答
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
于 2012-07-06T15:22:24.210 回答