count(*) 来自 2 个具有相同列的表

Posted

技术标签:

【中文标题】count(*) 来自 2 个具有相同列的表【英文标题】:count(*) from 2 tables with same columns 【发布时间】:2012-07-06 14:32:10 【问题描述】:

我手头有一个奇怪的问题,我确信我的 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. Y 的下 10 个值即 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 中转储缓存的理想情况下获得计数(),我会说从 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。

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

谢谢 导航

【问题讨论】:

您能否尝试更清楚地了解您希望从这些表中获得哪些数据?我读了你的帖子几次,我不是很理解你的问题。 请显示您尝试过的查询,以及您对给定数据集的预期结果。 提供一些示例数据是一个好的开始。但是,现在,您必须告诉我们您对给定谓词的期望输出。 不幸的是,我并没有更接近理解您要问的内容。让我们继续使用您发布的示例数据——引入不同的数据集只会让事情变得更复杂。您是否只想考虑两个表中特定 id 的 max(x) 和 max(y)?给定谓词 x=0 和 y=0 的样本数据,您期望的计数 (*) 是多少? 3?还是5?还是别的什么? 【参考方案1】:

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

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

【讨论】:

@user1507003 - EDIT 您添加示例数据的问题 - 您可以使用 按钮format 编码(和数据),并且有有可能它是可读的。 嗨,贾斯汀,感谢您如此快速的回复。为了您的参考,我添加了一个示例数据。现在,如果您看到表 2 中存在列“Y”的数据,因此如果我想要 table1 中的正确计数 (),我需要考虑 table2 中的数据以及 ID 4 和 5 的数据在表 1 和表 2。我希望这能让它更清楚一些。因此,如果您看到要求是根据 ID 字段从 table1 中获取所有行并从 table2 中获取匹配行,然后为 X=1 和 Y=1 或 X=0 和 Y 获取计数() =0。 @user1507003 - 示例数据很有用。您现在需要编辑您的问题,以向我们准确解释您想要给定谓词的输出。例如,给定您发布的样本数据,您对谓词x=1 and y=1 的期望是什么count(*)?为什么?为什么 table1table2id 值分别为 4 和 5 很重要? 嗨贾斯汀,非常感谢您的编辑和帮助。所以如果我说 X=1 和 Y=1 我应该得到 5 作为计数。 @user1507003 - 好的。现在你必须帮助我们解决“为什么”。 table1 中的三行具有 x=1 and y=1table2 中的零行具有 x=1 and y=1。我假设您要计算 id 4 和 5,因为它们在 table1 中有 x=1,在 table2 中有 y=1。您是否只想考虑两个表中特定idmax(x)max(y)?您对谓词x=0 and y=0 的期望是什么count(*)? 3?还是 5 个?【参考方案2】:
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

【讨论】:

以上是关于count(*) 来自 2 个具有相同列的表的主要内容,如果未能解决你的问题,请参考以下文章

在两个不同的表中创建具有相同列的视图 SQL

消息:未定义的索引:获取列名时(两个具有相同列的表)Codeigniter

连接来自两个不同表的两列

MS Access 查询:合并特定字段列中具有相同数据的行

SqlSever基础 count 查询两个相关关联的表中的具有相同内容的行数

C# 使用 Linq 连接具有 2 个相同列的 2 个表