【问题标题】:Using SQL raw query in SQlite for joining tables在 SQlite 中使用 SQL 原始查询来连接表
【发布时间】:2015-03-26 05:18:35
【问题描述】:

我有三个表(IncidentCategory、IncidentQuestion、IncidentOption),我需要在其中触发一个连接查询来安排和选择一些数据。同样,一些 SQL Server 开发人员编写了如下查询:

服务器查询

SELECT * FROM [IncidentQuestion] AS IQ WHERE IQ.[IncidentCategoryId]=27 AND  
IQ.[IsOption]=0 AND (SELECT COUNT(IO.[Id]) FROM [dbo]. [IncidentOption] AS 
IO WHERE IO.[IncidentQuestionId]=IQ.[Id])<>0 ORDER BY IQ.[OrderId] ASC;

DECLARE @False BIT; SET @False=0;SELECT IP.*,COALESCE(IV.[Id], 0) AS    
[IncidentValueId],COALESCE(IV.[IsChecked], @False) AS [IsChecked],IV.
[Value],IV.IncidentId FROM [IncidentOption] AS IP LEFT JOIN (SELECT * FROM 
[IncidentValue] WHERE [IncidentId]=0) AS IV ON IP.[Id]=IV.[IncidentOptionId] 
WHERE IP.[IncidentQuestionId]=68 ORDER BY IP.[OrderId] ASC;

在我的应用程序中,我创建了与服务器中列名相同的表。

IncidentQuestion DbHelper:

private static final String INCIDENT_QUESTION_TABLE = "IncidentQuestionTable";
private static final String ID = "_id";
private static final String SERVER_ID = "Id";
private static final String CONTRACT_TYPE_ID = "ContractTypeId";
private static final String INCIDENT_CATAGORY_ID = "IncidentCategoryId";
private static final String QTEXT = "QText";
private static final String TYPE = "Type";  
private static final String ORDER_ID = "OrderId";
private static final String IS_MANDATORY = "IsMandatory";
private static final String IS_OPTION = "IsOption";

private static final int DATABASE_VERSION = 1;
private static final String DATABASE_NAME = "IncidentQuestion";

private final Context context;
private SQLiteDatabase ourDatabase;
private DbHelper ourHelper;

public class DbHelper extends SQLiteOpenHelper {

    public DbHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);

    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        String locationQuery = "CREATE TABLE " + INCIDENT_QUESTION_TABLE + " ("
                + ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
                + SERVER_ID + " TEXT NOT NULL, " + CONTRACT_TYPE_ID
                + " TEXT NOT NULL, " + INCIDENT_CATAGORY_ID
                + " TEXT NOT NULL, " + QTEXT
                + " TEXT NOT NULL, " + TYPE
                + " TEXT NOT NULL, " + ORDER_ID
                + " TEXT NOT NULL, " + IS_MANDATORY
                + " TEXT NOT NULL, " + IS_OPTION + " TEXT NOT NULL);";

        db.execSQL(locationQuery);      

    }

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

    }

}

IncidentOption DbHelper:

private static final String INCIDENT_OPTION_TABLE = "IncidentOptionTable";
private static final String ID = "_id";
private static final String SERVER_ID = "Id";
private static final String INCIDENT_QUESTION_ID = "IncidentQuestionId";
private static final String OPTION_TEXT = "OptionText";
private static final String ORDER_ID = "OrderId";
private static final String PARENT_ID = "ParentId";

private static final int DATABASE_VERSION = 1;
private static final String DATABASE_NAME = "IncidentOption";

private final Context context;
private SQLiteDatabase ourDatabase;
private DbHelper ourHelper;

public class DbHelper extends SQLiteOpenHelper {

    public DbHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);

    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        String locationQuery = "CREATE TABLE " + INCIDENT_OPTION_TABLE + " ("
                + ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
                + SERVER_ID + " TEXT NOT NULL, "
                + INCIDENT_QUESTION_ID + " TEXT NOT NULL, " + OPTION_TEXT
                + " TEXT NOT NULL, " + ORDER_ID
                + " TEXT NOT NULL, " + PARENT_ID + " TEXT NOT NULL);";

        db.execSQL(locationQuery);      

    }

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

    }

}

所有的 Select、Insert、Create、Delete 查询都运行良好,我无法在我的本地数据库中转换和前瞻服务器查询。可以请任何人帮助我找出如何在我的本地数据库中编写服务器查询的方式,或者我将如何编写一些像服务器查询一样工作的查询。建议大多是可观的。

【问题讨论】:

  • 去掉括号。我不确定您在服务器端使用的是什么数据库,但我使用过 postgres、mysql 和 oracle,但它们都没有像那样使用 []。
  • @GabeSechan - SQL Server 使用[] 括号。
  • 您是否通过删除 [ ] 括号尝试了相同的查询?
  • @Priya 不幸的是我有不同的数据库。我必须在触发查询之前附加所有数据库。但我不知道在哪里(在哪个类/数据库处理程序中)正确 DB attach 查询和 joinquery。
  • 我什至认为你为什么要使用两个不同的数据库处理程序。我以前从未尝试过附加数据库。您可以在任何一个数据库处理程序中尝试。我也试试这个。

标签: android sql sql-server sqlite


【解决方案1】:

SQLite 支持 [括号] 以与 SQL Server 兼容;你不需要删除它们。

SQLite 没有 DECLARE。 在显示的查询中,False 是常量零(这也是 SQLite 处理布尔值的方式);只需删除 DECLARE 和 SET,然后将 @False 替换为 0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-11
    • 2014-07-01
    • 1970-01-01
    • 2017-03-28
    • 2021-12-05
    • 1970-01-01
    • 2017-12-28
    • 2017-10-23
    相关资源
    最近更新 更多