有没有一种方法可以防止JOIN将新数据集与旧数据集连接起来?

时间:2020-01-08 23:49:28

标签: python sqlite

conn = sqlite3.connect("lite.db")
    cur = conn.cursor()
    cur.execute("SELECT * FROM database JOIN database1")
    rows = cur.fetchall()
    for row in rows:
        print(row)
        tree.insert("", tk.END, values=row)
    conn.close()

我有两个SQLite3数据库,数据库和database1。当我将database1加入数据库并且用户输入要存储在数据库中的所有信息时,它会按预期方式将它们加入。但是,如果用户添加了新数据集,则旧数据集将再次加入新数据集。

例如用户输入:数据库中的Frank和数据库1中的Apple 显示结果:Frank Apple

用户输入:数据库中的William和数据库1中的Orange 显示结果:Frank Apple 弗兰克·奥兰治 威廉·奥兰治 威廉·苹果

如何阻止数据库修改任何其他存储的值?

预计:弗兰克·苹果 威廉·奥兰治

1 个答案:

答案 0 :(得分:0)

您不联接数据库,而是联接表。要在一个连接中使用多个数据库,您可以打开/连接一个数据库,并用一个模式附加另一个数据库,以区别它们,最初连接的数据库将具有一个主模式。

如果不为JOIN提供条件,那么所有排列/组合都是结果。

  • 您使用ON the_condition(s)

作为有条件和无条件的ATTACH和JOIN的演示:-

import sqlite3

# First database
connection1 = sqlite3.connect("database")
connection1.execute("CREATE TABLE IF NOT EXISTS table1 (id INTEGER PRIMARY KEY, name TEXT)")
connection1.commit()
connection1.execute("DELETE FROM table1")
connection1.execute("INSERT INTO table1 (name) VALUES('Frank'),('Mary'),('Joan')")
connection1.commit()
cursor = connection1.execute("SELECT * FROM table1")
print("\nData in table1 (in 1st Database)")
rows = cursor.fetchall()
for row in rows:
    print(row)

# Second database
connection2 = sqlite3.connect("database1")
connection2.execute("CREATE TABLE IF NOT EXISTS table2 (id INTEGER PRIMARY KEY, name TEXT)")
connection2.commit()
connection2.execute("DELETE FROM table2")
connection2.execute("INSERT INTO table2 (name) VALUES('Apple'),('Banana'),('Pear')")
connection2.commit()
cursor = connection2.execute("SELECT * FROM table2")
print("\nData in table 2 (in 2nd Database)")
rows = cursor.fetchall()
for row in rows:
    print(row)

connection2.close()

# Attach 2nd database to first
connection1.execute("ATTACH DATABASE 'database1' AS schema_database2")
connection1.commit()
# Use a JOIN
cursor = connection1.execute("SELECT * FROM main.table1 JOIN schema_database2.table2 ON table1.id = table2.id")
print("\nJoin Example 1 (schema not needed)")
rows = cursor.fetchall()
for row in rows:
    print(row)

# If there is no ambiguity of names (table names) then just table name can be used
print("\nJoin Example 2 (schema not needed)")
cursor = connection1.execute("SELECT * FROM table1 JOIN table2 ON table1.id = table2.id")
rows = cursor.fetchall()
for row in rows:
    print(row)

print("\nNatural (not recommended ) Join")
cursor = connection1.execute("SELECT * FROM table1 JOIN table2")
rows = cursor.fetchall()
for row in rows:
    print(row)

演示结果:-

Data in table1 (in 1st Database)
(1, 'Frank')
(2, 'Mary')
(3, 'Joan')

Data in table 2 (in 2nd Database)
(1, 'Apple')
(2, 'Banana')
(3, 'Pear')

Join Example 1 (schema not needed)
(1, 'Frank', 1, 'Apple')
(2, 'Mary', 2, 'Banana')
(3, 'Joan', 3, 'Pear')

Join Example 2 (schema not needed)
(1, 'Frank', 1, 'Apple')
(2, 'Mary', 2, 'Banana')
(3, 'Joan', 3, 'Pear')

Without JOIN conditions (joins everything to everything)
(1, 'Frank', 1, 'Apple')
(1, 'Frank', 2, 'Banana')
(1, 'Frank', 3, 'Pear')
(2, 'Mary', 1, 'Apple')
(2, 'Mary', 2, 'Banana')
(2, 'Mary', 3, 'Pear')
(3, 'Joan', 1, 'Apple')
(3, 'Joan', 2, 'Banana')
(3, 'Joan', 3, 'Pear')

Process finished with exit code 0