1

VBA を使用して、Access で SQL クエリを生成しています。必須またはオプションを示すステータス列を持つアイテムの 2 つのリストを返す 2 つの SQL クエリがあります。

"SELECT *, 'Required' as status FROM tblMain WHERE " & where_1
"SELECT *, 'Optional' as status FROM tblMain WHERE " & where_2

*where_1* と *where_2* は、VBA 内で作成する文字列変数です。ただし、それらが何であるかはあまり重要ではありません。

私がやりたいのは、1 つの結合されたリストを持つことです。項目が両方のリストに表示される場合、その項目を「必須」ステータスで 1 回だけ表示したいと思います (「必須」は「オプション」よりも優先されます)。ユニオン クエリから始めましたが、「オプション」ステータスの重複行を削除する方法がわかりません。

SELECT * FROM
((SELECT *, 'Required' as status FROM tblMain WHERE where_1)
UNION
(SELECT *, 'Optional' as status FROM tblMain WHERE where_2))

私は DISTINCT またはおそらく FIRST を使用できると考えていますが、残念ながら構文を理解するのに問題があります。

4

4 に答える 4

2

最初のステートメントで選択された ID を 2 番目のステートメントから削除することをお勧めします。

SELECT *, 'Required' as status FROM tblMain WHERE where_1
UNION
SELECT *, 'Optional' as status FROM tblMain WHERE where_2
AND ID Not IN (SELECT ID FROM tblMain WHERE where_1)
于 2012-07-25T16:31:35.770 に答える
1

使用できますMAX

SELECT *, MAX(status) FROM
((SELECT *, 'Required' as status FROM tblMain WHERE where_1)
UNION
(SELECT *, 'Optional' as status FROM tblMain WHERE where_2))
GROUP BY all_other_columns

「all_other_comuns」を実際の列に置き換える必要があることに注意してください。

于 2012-07-25T16:31:26.013 に答える
0

Since all of the data is coming from a single table, the best option may be to move the logic from a second query to the status column itself:

SELECT *, iif(condition1,'Required','Optional') as status 
FROM tblMain

This way each row in tblMain is only retrieved once in the first place.

于 2012-07-25T18:06:07.850 に答える
0

ユニオンなしでこれを行うことができます:

SELECT *,
       (case when where_1 then 'Required'
             when where_2 then 'Optional'
        end) as status
FROM tblMain
WHERE (where_1) or (where_2)

残念ながら、ACCESS には case ステートメントがないため、代わりに iif() を使用します。

SELECT *,
       iif(where_1, 'Required', 'Optional') as status
FROM tblMain
WHERE (where_1) or (where_2)
于 2012-07-25T18:07:43.577 に答える