Android 如何将两个不同的表合并到一个表中?

Android 如何将两个不同的表合并到一个表中?,android,android-sqlite,Android,Android Sqlite,我正在制作一个android销售基点系统,我正在努力组合两张桌子,我希望桌子上的食物和饮料在桌子菜单中组合 public static final String DATABASE_NAME = "FOODs.db"; //FOODs Tables name public static final String TABLE_FOODS = "table_Food"; public static final String TABLE_DRINKS = "table_drinks"; public s

我正在制作一个android销售基点系统,我正在努力组合两张桌子,我希望桌子上的食物和饮料在桌子菜单中组合

public static final String DATABASE_NAME = "FOODs.db";
//FOODs Tables name
public static final String TABLE_FOODS = "table_Food";
public static final String TABLE_DRINKS = "table_drinks";
public static final String TABLE_MENU = "table_data";


//FOODs Table Columns name
private static final String COL_1 = "Primary ID";
private static final String COL_2 = "NAME";
private static final String COL_3 = "PRICE";

public DatabaseHelper(Context context) {
    super(context, DATABASE_NAME, null, 1);
}

@Override
public void onCreate(SQLiteDatabase db) {
    String CreateTableMains = "CREATE TABLE " +  TABLE_FOODS + " (ID INTEGER PRIMARY KEY AUTOINCREMENT, " +
            " NAME TEXT, PRICE TEXT)";
    db.execSQL(CreateTableMains);

    String CreateTableDrinks = "CREATE TABLE " +  TABLE_DRINKS + " (ID INTEGER PRIMARY KEY AUTOINCREMENT, " +
            " NAME TEXT, PRICE TEXT)";
    db.execSQL(CreateTableDrinks);

    String CreateTable = "CREATE TABLE " +  TABLE_MENU + " (ID INTEGER PRIMARY KEY AUTOINCREMENT, " +
            " NAME TEXT, PRICE TEXT)";
    db.execSQL(CreateTable);
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_FOODS);
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_DRINKS);
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_MENU);

可以使用中间选择合并表

 SELECT * FROM table_Food UNION SELECT * FROM table_drinks

除非你碰巧有一种饮料和食物有相同的名字、相同的价格和相同的id,否则这两种方法都是一样的。没有所有重复的行将被省略。如此一来,一切都更安全了

  • 以上假设您需要所有列
  • 注意:每次选择的列数必须匹配
    • 但是你可以很容易地解决这个问题,例如,
      SELECT*,1因为table_Food的extracolumn
      在结果中添加了一个新的列
如果只需要使用一个表表数据,那么 要将table_food和table_drivers表中的数据加载到table_数据中,可以使用:-

INSERT INTO table_data (name,price) SELECT name,price FROM table_Food UNION ALL SELECT name,price FROM table_Drinks;
SELECT *,'Food' FROM table_Food UNION ALL SELECT *,'Drinks' FROM table_drinks UNION ALL SELECT *,'Menu' FROM table_Data;
  • id作为主键被省略。如果值相同,则由于唯一约束冲突,上述操作将失败

  • 很可能会有重复的id,因为id列有整数主键。这使该列成为rowid列(隐藏列)的别名,该列具有生成表唯一值的属性,该值最初为1,然后为2,然后为3(但不保证)。AUTOINCREMENT关键字增加了一个额外的扭曲,即唯一值必须大于现有或已使用的任何值

如果要临时合并所有3个表,则可以使用:-

SELECT * FROM table_Food UNION ALL SELECT * FROM table_drinks UNION ALL SELECT * FROM table_Data;
如果您想合并这三个表,并知道可以使用哪个表:-

INSERT INTO table_data (name,price) SELECT name,price FROM table_Food UNION ALL SELECT name,price FROM table_Drinks;
SELECT *,'Food' FROM table_Food UNION ALL SELECT *,'Drinks' FROM table_drinks UNION ALL SELECT *,'Menu' FROM table_Data;

您可以使用
UNION
操作符将不同的查询合并到一个结果集中。因此,如果我使用UNION,那么所有来自餐桌食品和餐桌饮料的数据(如名称和价格)都会合并到餐桌菜单中?不,它们会临时合并到结果集中(光标)。Oops遗漏了该位。将修改答案为cover.public Cursor showMenuData(){SQLiteDatabase db=this.getWritableDatabase();Cursor data=db.rawQuery(“SELECT*FROM”+表格食物+“UNION ALL SELECT*FROM”+表格饮料);返回数据;}我有一个错误,我想我没有完全正确地声明UNION。您遗漏了表名和UNION之间的一个空格。但是,答案会更新,以将所有行放在菜单表中。那么,是否有可能添加外部ID,以便在我合并到表菜单中时使所有数据具有不同的ID?