1

in句に入れたのとまったく同じレコードを返す select ステートメントを実行できるかどうか知りたいですか?

サンプル:

select * from table
where table_id in (1, 2, 3, 666);

この例のテーブルには 1 から 100 までの ID しかないため、この選択では 3 つの行のみが返されます。666 の 1 つの (おそらく null またはダミー) 行も取得するには、何をする必要がありますか?

ありがとう!

4

5 に答える 5

2

テーブルなしでも選べます

クエリでUNIONを実行するだけです

select table_id, some_column from table
where table_id in (1, 2, 3, 666);
union
select 666, 'dummy_data'
于 2010-08-27T14:06:47.837 に答える
2

ユニオンを使用できます:

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しているデータベース システムによって異なる場合があります。

ユニオンを使用する場合、ダミー クエリは実際のクエリと同じレコードを選択する必要があることに注意してください。

于 2010-08-27T14:08:32.500 に答える
1

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をプロシージャ コールに置き換えることができ、最大数の制限はありません。

于 2010-08-27T14:06:24.500 に答える
1

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はクライアントから渡されるコレクション型の変数です。

于 2010-08-27T14:20:59.957 に答える
0

これを考える 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
于 2010-08-27T14:06:54.950 に答える