0

次のように、SQLiteデータベースに3つのテーブルがあります。

表first_names

id
name
gender

表last_names

id
name

テーブル名

id
first
last
gender
birthday (null)
used (default 0)

最初と最後が一意であり、名前テーブルで両方が一意であるインデックスもあります。

名前テーブルをフィードするために、以下のクエリを使用しました。これは最初に機能しましたが、last_namesに新しい名前を追加して再度使用しようとすると、失敗しました。

INSERT INTO names (first, last, gender) 
       SELECT f.name AS first, l.name AS last, f.gender AS gender 
              FROM first_names f 
              LEFT JOIN last_names l 
              WHERE f.name NOT IN (SELECT first FROM names) AND 
                    l.name NOT IN (SELECT last FROM names)

(first, last, gender, [birthday], [used])asの値を使用してみnull AS [birthday], 0 AS [used]ましたが、テーブルデザインで誕生日がnullに設定され、デフォルトで0に設定されていて、初めて動作したため、必要になるとは思わず、とにかく違いはありませんでした。

一意のフィールドが原因だと思いますが、名前がテーブル名に含まれていないことを確認するためのWHEREがあります。

結果を要求せずに実行されているC#とSQLiteAdminを使用してクエリを試しましたが、そうでない場合は機能しません。

私のクエリの何が問題になっていますか?なぜそれが一度だけ機能するのですか?

4

3 に答える 3

2

使用してみてください: WHERE NOT EXISTS ( SELECT * FROM names n WHERE n.first=f.name AND n.last=l.name)

于 2012-10-24T22:20:48.403 に答える
1

姓と名が同じレコードにあることを確認していません。これはSQLコマンドラインで実行していませんが、機能するはずです。

INSERT INTO names (first, last, gender) 
       SELECT f.name AS first, l.name AS last, f.gender AS gender 
              FROM first_names f 
              LEFT JOIN last_names l 
              WHERE f.name NOT IN (SELECT subquery.first FROM (SELECT * FROM names WHERE l.name = last AND f.gender=gender) subquery)
于 2012-10-24T22:20:49.827 に答える
0

last_namesに別の名前を追加した場合でも、names.firstに存在しないfirst_names.nameには値がないため、クエリは1回だけ機能します。

WHERE 
  f.name NOT IN (SELECT first FROM names) AND
  l.name NOT IN (SELECT last FROM names)

f.nameの可能なすべての値はに含まれていますSELECT first FROM names

おそらく、これらの句をANDではなくORで結合する必要があります。

于 2012-10-24T22:26:33.370 に答える