我手头有一个奇怪的问题,我确信我的 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。
我希望这回答了你的问题。
谢谢马夫