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

Sql 从具有相同列的2个表中计数(*),sql,oracle,Sql,Oracle,我手头有一个奇怪的问题,我确信我在SQL方面非常糟糕 问题如下: 我有两张桌子表1和表2。这两个表具有相同的列集,即ID号、X号、Y号。这里X和Y的值为0或1 现在假设,例如,表1中ID的范围为1-100,表2中ID的范围为91-200:在表1中,X的所有100行都有值,比如说1,而在同一个表中,Y的值仅为90,比如说1。下10个Y值(91-100)如表2所示 现在,为各种查询调用count(*),比如X=1和Y=1,X=1和Y=0等,我没有得到正确的值,因为表2中存在一些Y值集。我一直在寻找左

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

问题如下:

我有两张桌子表1和表2。这两个表具有相同的列集,即ID号、X号、Y号。这里X和Y的值为0或1

现在假设,例如,表1中ID的范围为1-100,表2中ID的范围为91-200:在表1中,X的所有100行都有值,比如说1,而在同一个表中,Y的值仅为90,比如说1。下10个Y值(91-100)如表2所示

现在,为各种查询调用count(*),比如X=1和Y=1,X=1和Y=0等,我没有得到正确的值,因为表2中存在一些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代表表1,g2代表表2。p1、p2和p3中的每一个都有一个限制,比如100个ID。有可能P1在g1(表1)中转储了ID的1-100,其中p2在g1(表1)中转储了90,在g2(表2)中转储了其余10,类似地,p3在g1(表1)中转储了95,在g2(表2)中转储了其余5。然而,p1、p2和p3中的每一个都转储了100个ID,但属于不同的组。现在,如果我想在理想情况下得到count(),当所有P1、P2和P3都在g1中转储缓存时,我会说从g1中得到max(id),其中P1=1,同样地,从g1中得到min(id),其中P1=1。我将写一个查询,从G1中选择“选择计数”,其中x=1,y=1,z=1,其中从M1(ID)到G1之间的ID(ID)和G1(ID)。在理想情况下,它将返回100。但是在当前情况下,它返回90,这是不正确的。因此,为了解决这个问题,我还必须考虑在G2中存在的ID(表2)。 我希望这能回答你的问题

谢谢
mav

听起来,在应用谓词之前,您希望
合并
合并所有
两个表

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
将消除重复行


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

听起来您希望在应用谓词之前将这两个表联合起来。差不多

SELECT COUNT(*)
  FROM (SELECT id, x, y
          FROM table1
        UNION ALL
        SELECT id, x, y
          FROM table2)
 WHERE x = 1
   AND y = 1;
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
UNION ALL
将返回两个表中的每一行。
UNION
将消除重复行

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

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
或者如果您想使用高级GROUPBY子句

SELECT COUNT(*)
FROM
(SELECT *
FROM TABLE1
UNION ALL
SELECT *
FROM TABLE2)
HAVING MAX(X) = 1 AND MAX(Y) = 1
GROUP BY ID
或者如果您想使用高级GROUPBY子句

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

您能否尝试更清楚地了解您希望从这些表中获得哪些数据?我阅读了几次您的帖子,但我并不真正理解您的问题。请显示您尝试过的查询,以及您对给定数据集的预期结果。提供一些示例数据是一个良好的开端。不过,现在您必须告诉我们对于给定的谓词,我们期望输出什么。不幸的是,我并没有更接近理解你要问的内容。让我们坚持你所发布的示例数据——引入不同的数据集只会使事情变得更复杂。你只想考虑max(x)和max(y)吗?在两个表中使用特定id?什么计数(*)如果你给出了谓词x=0和y=0的样本数据,你会期望得到吗?3?或5?或其他什么?你能试着更清楚地了解你想要从这些表中得到什么数据吗?我读了你的帖子好几次,但我并不真正理解你的问题。请展示你尝试过的查询,以及你期望得到的结果提供一些示例数据是一个很好的开始。不过,现在,您必须告诉我们您对给定谓词的预期输出。不幸的是,我还不太了解您想要问什么。让我们继续使用您发布的示例数据——引入不同的数据集只会使事情变得更复杂。Do你只想考虑两个表上的特定ID的max(x)和max(y)吗?对于给定的谓词x=0和y=0?3或5?或者其他什么样的数据,你希望得到什么计数(*)?@ USER1579003-编辑你的问题来添加样本数据-你可以使用<代码> { }来格式化代码(和数据)。按钮,它可能会可读。您好,贾斯汀,谢谢您这么快的回复。为了您的参考,我添加了一个示例数据。现在,如果您看到表2中有“Y”列的数据,那么如果我想要一个正确的计数()从表1中,我需要考虑表2中的数据以及ID 4和5的数据在表1和表2之间的划分。希望这一点稍微清楚一些。因此,如果您看到的要求是从表1获取所有行,并从ID字段中匹配表2,而不是得到一个计数()。例如X=1和Y=1,或者X=0和Y=0。@user1507003-示例数据很有用。您现在需要编辑您的问题,以便向我们解释您想要给定谓词的输出。例如,
count(*)
如果您发布了示例数据,您是否希望谓词
x=1和y=1
?为什么?为什么
table1
table2