1

手元に奇妙な問題があり、SQL が非常に苦手であると確信しています。

問題は次のとおりです。

table1 と table2 の 2 つのテーブルがあります。両方のテーブルには、ID 番号、X 番号、Y 番号という同じ列のセットがあります。ここで、X と Y の値は 0 または 1 になります。

たとえば、テーブル 1 では ID の範囲が 1 ~ 100 で、テーブル 2 では 91 ~ 200 の範囲であるとします。 91-100 である Y の次の 10 個の値は table2 にあります。

ここで、X=1 と Y=1、X=1 と Y=0 などのさまざまなクエリに対して count(*) を呼び出すと、テーブル 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 を取得する必要があります。

こんにちはジャスティン、実際のシナリオを説明させてください。P1、P2、および P3 が X、Y、および Z 列にすぎないキャッシュを持つ 3 つのプロセス p1、p2、および p3 を考えてみます。このキャッシュの内容は ID に他なりません。IF p1 dumps and Id 1 ID=1 に対して X=1 と言うでしょう。これらの各プロセスは、g1 と g2 などのグループにキャッシュをダンプします。g1 と g2 に関するテーブルを作成しました。したがって、g1 は table1 を表し、g2 は table2 を表します。p1、p2、および p3 のそれぞれには、たとえば 100 個の ID をダンプするという制限があります。P1 が ID の 1 ~ 100 を g1(table1) にダンプした可能性があります。ここで、p2 は g1(table1) に 90 だけをダンプし、残りの 10 を g2(table2) にダンプしました。同様に、p3 は g1(table1) に 95 をダンプし、残りのg2(テーブル2)で5。ただし、p1、p2、および p3 はそれぞれ 100 個の ID をダンプしましたが、グループは異なります。今、カウントを取得したい場合() 理想的なケースでは、すべての P1、P2、および P3 が g1 にキャッシュをダンプした場合、P1=1 の g1 から max(id) を取得し、P1=1 の g1 から同様に min(id) を取得します。「select count( ) from g1 where X=1 and Y=1 and Z=1 where ID between g1 from min(id) and max(id) from g1. 理想的なケースでは、 100 が返されましたが、現在のケースでは正しくない 90 が返されているため、この問題を解決するには、g2(table2) に存在する ID も考慮する必要があります。

これがあなたの質問に答えることを願っています。

ありがとう

4

2 に答える 2

4

UNION述語を適用する前に、2つ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重複行を削除します。

これが望まない場合は、各テーブルに数行のサンプル データを作成し、必要な結果とその結果をどのように取得したかを正確に示す例を紹介すると、非常に役立ちます。

于 2012-07-06T14:47:25.197 に答える
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
于 2012-07-06T15:22:24.210 に答える