CFQuery, где сравнение предложения с результатами запроса

У меня есть запрос, который возвращает 7 записей:

<cfquery name="equip" datasource="#datasource#">
select equipment_id from service_ticket
where equipment_id > 0
</cfquery>

Затем я беру эти результаты и снова запускаю другой запрос:

<cfquery name="get_equipment_tally" datasource="#datasource#">
select *
from equipment_maintenance
where active = "yes" AND id <> #equip.equipment_id#
</cfquery>

Но запрос «get_equipment_tally» сравнивает только «id» с первой записью из моих результатов запроса «equip» в предложении where, хотя возвращено семь записей.

Есть ли способ обойти это?


person Brian Fleishman    schedule 10.03.2017    source источник
comment
Ваше наблюдение за is only comparing 'id' to the first record является поведением по умолчанию, когда вы не указываете номер строки.   -  person Dan Bracuk    schedule 10.03.2017


Ответы (2)


AND id NOT IN <cfqueryparam cfsqltype="cf_sql_integer" 
    value="#valueList(equip.equipment_id)#" list="true">

В идеале вы бы превратили это в один запрос, хотя

<cfquery name="get_equipment_tally" datasource="#datasource#">
select *
from equipment_maintenance
where active = "yes" AND id NOT IN (select equipment_id  from service_ticket where equipment_id > 0)
</cfquery>
person Matt Busche    schedule 10.03.2017
comment
Это сработало идеально, спасибо! Я понятия не имел, что вы указываете такой запрос в предложении where. - person Brian Fleishman; 10.03.2017
comment
SQL обладает огромной гибкостью, если вы сомневаетесь, попробуйте его и посмотрите, что произойдет. - person Matt Busche; 10.03.2017
comment
@BrianFleishman - FWIW, это называется подзапросом. Вы также можете добиться того же результата с помощью СУЩЕСТВУЕТ. У каждого есть за и против в зависимости от конкретного запроса , индексы и так далее. (EXPLAIN удобно использовать при сравнении) - person Leigh; 10.03.2017
comment
Потрясающий. Спасибо. - person Brian Fleishman; 11.03.2017

Мне нравятся эти ответы, но когда я вижу NOT IN в запросе, меня дергает. Вместо этого используйте LEFT OUTER JOIN... IS NULL. Это будет НАМНОГО быстрее.

SELECT <list of cols here>
FROM equipment_maintenance em
LEFT OUTER JOIN equipment_id ei ON ei.equipment_id = em.equipment_id
WHERE em.Active = 'yes'
 AND ei.equipment_id IS NULL

Что-то такое.

person Shawn    schedule 06.04.2017