9

基本的に、1 つの質問と 1 つの問題があります。

1. 質問- テーブルに 100 個の列があり (キーまたは uindex が設定されていない)、そのテーブル自体を結合またはサブ選択したい場合、すべての列名を書き出す必要がありますか?

2. 問題- 以下の例は、1. の質問と実際の SQL ステートメントの問題を示しています

例:

A.FIELD1,
(SELECT CASE WHEN B.FIELD2 = 1 THEN B.FIELD3 ELSE null FROM TABLE B WHERE A.* = B.*) AS CASEFIELD1
(SELECT CASE WHEN B.FIELD2 = 2 THEN B.FIELD4 ELSE null FROM TABLE B WHERE A.* = B.*) AS CASEFIELD2
FROM TABLE A
GROUP BY A.FIELD1

ストーリーは次のとおりです: CASE を独自の select ステートメントに入れないと、実際の行名を GROUP BY に入れる必要があり、GROUP BY は CASE からの NULL 値をグループ化せず、実際の値を行。そのため、キーもuindexもないため、すべての列を結合またはサブ選択するか、何らかの方法で別の解決策を見つける必要があります。

DB サーバーは DB2 です。

それでは、SQL を使用せずに単語だけで説明します。「ZD」と「EK」 (1 = ZD、2 = EK) に分割でき、「ディストリビューター」によってグループ化できる「注文項目」があります。「注文項目」は 2 つの異なる「部門」(ZD、EK) のいずれかを持つことができますが、「ZD」と「EK」のフィールド/行は常に両方とも入力されます。「部門」を考慮するためにグループ化が必要であり、指定された「部門」(ZD または EK) が変更された場合にのみ、新しいグループを作成する必要があります。

SELECT
(CASE WHEN TABLE.DEPARTEMENT = 1 THEN TABLE.ZD ELSE null END) AS ZD,
(CASE WHEN TABLE.DEPARTEMENT = 2 THEN TABLE.EK ELSE null END) AS EK,
TABLE.DISTRIBUTOR,
sum(TABLE.SOMETHING) AS SOMETHING,
FROM TABLE
GROUP BY
ZD
EK
TABLE.DISTRIBUTOR
TABLE.DEPARTEMENT

これは、SELECT と ZD、GROUP BY の EK で機能しました。唯一の問題は、EK が指定された DEPARTEMENT ではなくても、変更された場合でも新しいグループを開くことでした。これは、既に説明したように、CASE からの NULL ではなく実際の EK 値を使用していたためです。

4

5 に答える 5

1

いいえ、ワイルドカードの等価性テストはありません。個別にテストするすべてのフィールドをリストする必要があります。個々のフィールドをテストしたくない場合は、すべてのフィールドを連結するなどのハックを使用できます。

WHERE (a.foo + a.bar + a.baz) = (b.foo + b.bar + b.az)

いずれにしても、すべてのフィールドをリストしています。

于 2013-07-31T14:40:08.163 に答える
0

TableB に一致する TableA のすべての行を検索する必要がある場合、INTERSECT または INTERSECT DISTINCT はどうでしょうか。

select * from A
 INTERSECT DISTINCT
select * from B

ただし、行全体が B の行の値と一致する A の行のみが必要な場合、なぜサンプル コードは A からいくつかの値を取得し、B から他の値を取得するのでしょうか? 行がすべての列で一致する場合、それは無意味に思えます。(おそらく、あなたの質問はもう少し完全に説明できますか?)

于 2013-07-31T16:32:29.747 に答える