我手头有一个奇怪的问题,我确信我在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
答案 0 :(得分: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
将消除重复的行。
如果这不是您想要的,那么通过一个示例来说非常有帮助,您可以在每个表中创建几行示例数据,并向我们展示您想要的结果以及如何获得该结果。
答案 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