SQLite:我可以在where语句中使用where语句吗?

时间:2015-06-30 07:45:22

标签: sql ruby-on-rails sqlite

我正在使用Arel在Ruby on Rails中编写SQL查询,我将在SQLite数据库中执行这些语句。

因为我的查询是由其他复杂的语句组成的,所以我认为我可以在另一个where语句中包含where语句。

例如:

SELECT * FROM "patients" INNER JOIN "encounters" INNER JOIN "conditions" WHERE "patients"."patient_characteristic_birthdate" <= '1997-06-30 07:25:50 UTC' AND "encounters"."length_of_stay" <= 120 AND "encounters"."encounter" = 'Inpatient Encounter' AND (SELECT * FROM "patients" INNER JOIN "conditions" WHERE ("conditions"."diagnosis" = 'cancer' OR "conditions"."diagnosis" = 'obesity')))

对于此声明,我有以下错误: ActiveRecord :: StatementInvalid(SQLite3 :: SQLException:只有一个结果允许SELECT作为表达式的一部分:

例如我的数据模型可以是:

Patients: encounter_id,ssn, birth_date, gender, race
Conditions: encounter_id,diagnosis, primary_problem
Encounters: patient_id, arrival, departure, lenght_of_stay, encounter

数据可以是:

Patients: encounter_id,12345, 12/6/1974, male, latino
Conditions: encounter_id,Obesity, blood presure
Encounter: patient_id,date_start, date_end, 10 days, Encounter inpatient

问题是我在树结构中接收查询,所以我必须构造一个嵌套语句。但也许还有另一种更简单的方法吗?

即使我包含了我正在进行的联接的id字段,错误也是一样。

ActiveRecord::StatementInvalid (SQLite3::SQLException: only a single result allowed for a SELECT that is part of an expression

就像我不能在where语句中包含另一个where语句

1 个答案:

答案 0 :(得分:0)

select * from patients p,encounters AS e, CONDITIONS AS C where p.birth_date <='1997-06-30' AND e.lenght_of_stay<'119' and e.encounter='Inpatient Encounter' and c.diagnosis='cancer' OR c.diagnosis='obesity'

尝试输出所需的输出。 假设的表结构是: -

desc遭遇

Name           Null Type         
-------------- ---- ------------ 
PATIENT_ID          VARCHAR2(50) 
ARRIVAL             VARCHAR2(50) 
DEPARTURE           VARCHAR2(50) 
LENGHT_OF_STAY      VARCHAR2(50) 
ENCOUNTER           VARCHAR2(50)

desc患者

Name         Null Type         
------------ ---- ------------ 
ENCOUNTER_ID      VARCHAR2(50) 
SSN               VARCHAR2(50) 
BIRTH_DATE        VARCHAR2(50) 
GENDER            VARCHAR2(50) 
RACE              VARCHAR2(50) 

desc条件

Name            Null Type         
--------------- ---- ------------ 
ENCOUNTER_ID         VARCHAR2(50) 
DIAGNOSIS            VARCHAR2(50) 
PRIMARY_PROBLEM      VARCHAR2(50)

原始查询结构中的问题不在您的&#39;其中&#39;条款。我觉得这是错误的选择陈述的情况。因为您的查询会转换为: -

..AND "encounters"."encounter" = 'Inpatient Encounter' and (--return entire table structure using select *! )无法使用&#39; where&#39;进行分析。在哪里需要像参数=值的过滤器。

我对使用UNION持怀疑态度,因为要使用union,我们在两个选择中都需要相同数量的表达式。

您可以使用&#39;其中&#39;在另一个&#39;里面&#39;如下(样本):

select * from patients where ENCOUNTER_ID='1' and BIRTH_DATE IN (select BIRTH_DATE from patients where birth_date <'2001-07-12');