in句に入れたのとまったく同じレコードを返す select ステートメントを実行できるかどうか知りたいですか?
サンプル:
select * from table
where table_id in (1, 2, 3, 666);
この例のテーブルには 1 から 100 までの ID しかないため、この選択では 3 つの行のみが返されます。666 の 1 つの (おそらく null またはダミー) 行も取得するには、何をする必要がありますか?
ありがとう!
in句に入れたのとまったく同じレコードを返す select ステートメントを実行できるかどうか知りたいですか?
サンプル:
select * from table
where table_id in (1, 2, 3, 666);
この例のテーブルには 1 から 100 までの ID しかないため、この選択では 3 つの行のみが返されます。666 の 1 つの (おそらく null またはダミー) 行も取得するには、何をする必要がありますか?
ありがとう!
テーブルなしでも選べます
クエリでUNIONを実行するだけです
select table_id, some_column from table
where table_id in (1, 2, 3, 666);
union
select 666, 'dummy_data'
ユニオンを使用できます:
select * from table
where table_id in (1, 2, 3);
union
select 666 as table_id, other_fields_with_dummy_values_in_table from dual;
Oracleでそれを行う方法です。使用from dual
しているデータベース システムによって異なる場合があります。
ユニオンを使用する場合、ダミー クエリは実際のクエリと同じレコードを選択する必要があることに注意してください。
numbers
たとえば、1 から 1000000 までのすべての数値を含むテーブルを想定すると(実際には、入力値の範囲をカバーするのに十分です)、次の SQL を実行できます。
SELECT *
FROM numbers left outer join table on table.table_id = numbers.number
WHERE numbers.number in (1, 2, 3, 666)
SQL Anywhere のsa_rowgeneratorプロシージャなど、より優れたソリューションを提供する DBMS を使用する場合、テーブルnumbers
をプロシージャ コールに置き換えることができ、最大数の制限はありません。
IN
句はブール述語であるため、ダミーのレコードセットに置き換える必要があります。
SELECT m.*
FROM (
SELECT 1 AS id
UNION ALL
SELECT 2 AS id
UNION ALL
SELECT 3 AS id
UNION ALL
SELECT 666 AS id
) q
LEFT JOIN
mytable m
ON m.id = q.id
ではSQL Server 2008
、次のクエリを実行できます。
SELECT *
FROM @mydata d
LEFT JOIN
mytable t
ON t.id = d.id
with@mydate
は、クライアントからパラメーターとして渡されるテーブル変数です。
ではPostgreSQL
、次のクエリを実行できます。
SELECT *
FROM (
SELECT :arr[s] AS id
FROM generate_series(1, array_upper(:arr, 1)) s
) q
LEFT JOIN
mytable t
ON t.id = q.id
where:arr
は array[1, 2, 3, 666]
であり、これもクライアントからパラメーターとして渡されます。
ではOracle
、次のことができます。
SELECT *
FROM TABLE(:mycol) q
LEFT JOIN
mytable t
ON t.id = q.id
ここで、:mycol
はクライアントから渡されるコレクション型の変数です。
これを考える 1 つの方法は、そのデータをデータ セットとしてクエリに「入力」する必要があるということです。where句で見つかったデータはクエリに「追加」されることはなく、既存のデータを除外するためにのみ使用されます。
簡単な例:
DECLARE @MustInclude (Value int not null)
INSERT @MustInclude (Value) values (1)
INSERT @MustInclude (Value) values (2)
INSERT @MustInclude (Value) values (3)
INSERT @MustInclude (Value) values (666)
SELECT *
from @MustInclude mi
left outer join MyTable mt
on mt.Value = mi.Value