4

私はこの非常に単純な目標を持っていますが、単純な解決策は考えられませんでした。ユーザー入力から取得される値のリストがあり、そのうちの少なくとも 1 つがデータベースに存在しないかどうかを確認したいと考えています。入力した値が重複する可能性があることに注意してください。

マイテーブル:

| id | name |
| 0  | Bob  |
| 1  | Ben  |
| 2  | John |
| 3  | Rex  |

ユーザーが入力したサンプル値:

1、2、2、4

存在しない値の数。この場合は 4 です。

1

私はこのようなことができます:

select count(userInput.value)
from
   (select 1 as value
    union all
    select 2
    union all
    select 2
    union all
    select 4) as userInput
left join myTable
on myTable.value = myTable.id
where myTable.id is null

上記のコードは、myTable から一致しない (myTable.id が null) すべての値をカウントします。これは機能しますが、多くのユニオンを使用する必要のない単純なソリューションを探しています。それをやろうとした人はいますか?

編集

これは動作しません!

select count(myTable.id)
from myTable
where myTable.id not in(1,2,2,4)

上記のコードは、入力値に存在しない ID をカウントします。ID 0 と 3 は入力値に存在しないため、結果は 2 になります。値 4 はテーブルに存在しない唯一の値であるため、予想される出力は 1 であることに注意してください。

4

2 に答える 2

1

私はあなたのアプローチがうまくいくと思います:

SELECT * 
FROM
  (SELECT 1 value
   UNION ALL
   SELECT 2
   UNION ALL
   SELECT 2
   UNION ALL
   SELECT 4) ui
LEFT JOIN myTable mt
  ON mt.id = ui.value

戻り値

| 値| ID | 名前|
---------------------------
| 1 | 1 | ベン|
| 2 | 2 | ジョン|
| 2 | 2 | ジョン|
| 4 | (null)| (null)|

だから、どこでカウントを尋ねますid IS NULL

SELECT COUNT(*) cnt
FROM
  (SELECT 1 value
   UNION ALL
   SELECT 2
   UNION ALL
   SELECT 2
   UNION ALL
   SELECT 4) ui
LEFT JOIN myTable mt
  ON mt.id = ui.value
WHERE mt.id IS NULL

結果

| CNT |
-------
| 1 |

デモを見る

于 2013-03-11T02:10:01.330 に答える
1

私は自分のPCの前にいませんが、次のようなものです:

Select id from mytable where (
Select count(id) 
From myTable
where id in (1,2,4) 
Group by id) =0

うまくいくかもしれない

于 2013-03-11T02:28:40.097 に答える