【发布时间】: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?还是别的什么?