5

SQLiteには2つのテーブルがあります。

Table1:
-------
id
name

Table2:
-------
id
temp_name

Table2私の質問は、にない名前を返すSQLクエリをどのように書くのTable1ですか?

例えば:

Table1:
-------
1, 'john'
2, 'boda',
3, 'cydo',
4, 'linus'

Table2:
-------
1123, 'boda'
2992, 'andy',
9331, 'sille',
2,    'cydo'

この例では、SQLクエリは要素andysillefromを返す必要があります。これは、要素Table2がにないためですTable1

4

5 に答える 5

11

これは、「明らかな」標準SQLでそれを行う方法です。

select *
from table2
where temp_name not in (select name from table1)

句でのusingleft outer joinや操作など、他の方法もあります。existswhereexcept

于 2013-02-11T18:45:47.920 に答える
4

どのオプションが私のユースケースに最適であるかについて興味があり、結果を共有した場合、他の人に役立つかもしれないと思いました。

要するに、(私にとっては!)最も高速な場所を選択してください。また、すべてのオプションを使用すると、を除いて重複が返されることにも注意してください。

Option 0: SELECT {c2} FROM {t2} WHERE {c2} not in (SELECT {c1} FROM {t1});
    Entries returned: 1098, Unique entries returned: 357
    Average: 1.8680 seconds
    Entries returned: 0, Unique entries returned: 0
    Average: 0.6664 seconds
Option 1: SELECT {c2} FROM {t2} EXCEPT SELECT {c1} FROM {t1};
    Entries returned: 357, Unique entries returned: 357
    Average: 3.9455 seconds
    Entries returned: 0, Unique entries returned: 0
    Average: 3.3074 seconds
Option 2: SELECT {t2}.{c2} FROM {t2} LEFT OUTER JOIN {t1} ON {t1}.{c1} = {t2}.{c2} WHERE {t1}.{c1} IS null;
    Entries returned: 1098, Unique entries returned: 357
    Average: 2.3330 seconds
    Entries returned: 0, Unique entries returned: 0
    Average: 1.1982 seconds
Option 3: SELECT {c2} FROM {t2} WHERE NOT EXISTS (SELECT 1 FROM {t1} WHERE {c1} = {t2}.{c2});
    Entries returned: 1098, Unique entries returned: 357
    Average: 2.6945 seconds
    Entries returned: 0, Unique entries returned: 0
    Average: 0.9737 seconds

数字を実行するために使用したコードは次のとおりです。

import sqlite3
import timeit

# Database path here
database = "database.db"

# Your table and column names here
t1, c1 = 'Table_1', 'name'
t2, c2 = 'Table_2', 'temp_name'

# Reverse the test
dbs = [{'t1': t1, 'c1':c1, 't2': t2, 'c2': c2},
       {'t1': t2, 'c1':c2, 't2': t1, 'c2': c1}]

commands = ["SELECT {c2} FROM {t2} WHERE {c2} not in (SELECT {c1} FROM {t1});",
"SELECT {c2} FROM {t2} EXCEPT SELECT {c1} FROM {t1};",
"SELECT {c2} FROM {t2} LEFT OUTER JOIN {t1} ON {t1}.{c1} = {t2}.{c2} WHERE {t2}.{c2} IS null;",
"SELECT {c2} FROM {t2} WHERE NOT EXISTS (SELECT 1 FROM {t1} WHERE {c1} = {t2}.{c2});",]

for i, c in enumerate(commands):
    print("Option {}: {}".format(i, c))
    for db in dbs:
        co = c.format(**db)
        foo = sqlite3.connect(database).execute(co).fetchall()
        # Sanity check that entries have been found and how many
        print("\tEntries returned: {}, Unique entries returned: {}".format(len(foo), len({a[0] for a in foo})))
        # Reconnect to the database each time - I can't remember if there's any caching
        t = timeit.repeat(lambda: sqlite3.connect(database).execute(co).fetchall(), repeat=5, number=1)
        print('\tAverage: {:.4f} seconds'.format(statistics.mean(t)))
于 2015-11-02T15:36:17.343 に答える
3
select name
from table2
except
select temp_name
from table1
于 2013-02-11T20:14:04.013 に答える
2

左の参加バージョン:

select t2.* from Table2 t2
left outer join Table1 t1 on t1.name = t2.temp_name
where t2.temp_name is null
于 2013-02-11T18:49:12.393 に答える
1

EXISTSゴードンが言及した方法:

SELECT *
FROM Table2
WHERE NOT EXISTS (SELECT 1
                  FROM Table1
                  WHERE Table1.name = Table2.temp_name)
于 2013-02-11T20:20:55.173 に答える