我正在使用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语句
答案 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');