SQL ГДЕ.. В предложении несколько столбцов
Мне нужно реализовать следующий запрос в SQL Server:
select *
from table1
WHERE (CM_PLAN_ID,Individual_ID)
IN
(
Select CM_PLAN_ID, Individual_ID
From CRM_VCM_CURRENT_LEAD_STATUS
Where Lead_Key = :_Lead_Key
)
но WHERE..IN предложение позволяет только 1 столбец. Как я могу сравнить 2 или более столбцов с другим внутренним выбором?
12 ответов:
вы можете создать производную таблицу из подзапроса и присоединить table1 к этой производной таблице:
select * from table1 LEFT JOIN ( Select CM_PLAN_ID, Individual_ID From CRM_VCM_CURRENT_LEAD_STATUS Where Lead_Key = :_Lead_Key ) table2 ON table1.CM_PLAN_ID=table2.CM_PLAN_ID AND table1.Individual=table2.Individual WHERE table2.CM_PLAN_ID IS NOT NULL
вместо этого вы хотите использовать синтаксис WHERE EXISTS.
SELECT * FROM table1 WHERE EXISTS (SELECT * FROM table2 WHERE Lead_Key = @Lead_Key AND table1.CM_PLAN_ID = table2.CM_PLAN_ID AND table1.Individual_ID = table2.Individual_ID)
простое предложение EXISTS является самым чистым
select * from table1 t1 WHERE EXISTS ( Select * --or 1. No difference. From CRM_VCM_CURRENT_LEAD_STATUS Ex Where Lead_Key = :_Lead_Key -- correlation here AND t1.CM_PLAN_ID = Ex.CM_PLAN_ID AND t1.CM_PLAN_ID = Ex.Individual_ID )Если у вас есть несколько строк в корреляции, то соединение дает несколько строк в выходных данных, поэтому вам нужно будет различать. Что обычно делает существование более эффективным.
Примечание "SELECT" * с соединением также будет включать столбцы из таблиц ограничения строк
select * from tab1 where (col1,col2) in (select col1,col2 from tab2)Примечание:
Oracle игнорирует строки, в которых один или несколько выбранных столбцов имеют значение NULL. В этих случаях вы, вероятно, хотите использовать NVL - функция отображения NULL в специальное значение (которое не должно быть в значениях);select * from tab1 where (col1, NVL(col2, '---') in (select col1, NVL(col2, '---') from tab2)
зачем использовать WHERE EXISTS или производные таблицы, когда вы можете просто сделать нормальное внутреннее соединение:
SELECT t.* FROM table1 t INNER JOIN CRM_VCM_CURRENT_LEAD_STATUS s ON t.CM_PLAN_ID = s.CM_PLAN_ID AND t.Individual_ID = s.Individual_ID WHERE s.Lead_Key = :_Lead_Keyесли пара (CM_PLAN_ID, Individual_ID) не уникальна в таблице состояния, вам может потребоваться выбрать отдельный t.* вместо этого.
Если вы хотите для одной таблицы, то используйте следующий запрос
SELECT S.* FROM Student_info S INNER JOIN Student_info UT ON S.id = UT.id AND S.studentName = UT.studentName where S.id in (1,2) and S.studentName in ('a','b')и данные таблицы как следовать
id|name|adde|city 1 a ad ca 2 b bd bd 3 a ad ad 4 b bd bd 5 c cd cdзатем выводится следующим образом
id|name|adde|city 1 a ad ca 2 b bd bd
запрос:
select ord_num, agent_code, ord_date, ord_amount from orders where (agent_code, ord_amount) IN (SELECT agent_code, MIN(ord_amount) FROM orders GROUP BY agent_code);запрос работал для меня в MySQL. см. следующую ссылку -->
https://www.w3resource.com/sql/subqueries/multiplee-row-column-subqueries.php
объединение столбцов вместе в той или иной форме является "взломом", но когда продукт не поддерживает полу-соединения для более чем одного столбца, иногда у вас нет выбора.
пример:
select * from T1 where <boolean expression> and (<boolean expression> OR (ColA, ColB) in (select A, B ...)) and <boolean expression> ...когда запросы не являются тривиальными по своей природе, иногда у вас нет доступа к базовой таблице, установленной для выполнения регулярных внутренних/внешних соединений.
Если вы используете этот "хак", при объединении полей просто не забудьте добавить достаточно разделителя между ними, чтобы избежать неверные интерпретации, например
ColA + ":-:" + ColB
Postgres SQL : version 9.6 Total records on tables : mjr_agent = 145, mjr_transaction_item = 918001.С помощью
EXISTS[среднее время запроса: 1.42 s]SELECT count(txi.id) FROM mjr_transaction_item txi WHERE EXISTS ( SELECT 1 FROM mjr_agent agnt WHERE agnt.agent_group = 0 AND (txi.src_id = agnt.code OR txi.dest_id = agnt.code) )2.Использование с двумя линиями
INпредложение [среднее время запроса: 0,37 с]SELECT count(txi.id) FROM mjr_transaction_item txi WHERE txi.src_id IN ( SELECT agnt.code FROM mjr_agent agnt WHERE agnt.agent_group = 0 ) OR txi.dest_id IN ( SELECT agnt.code FROM mjr_agent agnt WHERE agnt.agent_group = 0 )3.С помощью
INNNER JOINшаблон [среднее время запроса: 2.9 s]SELECT count(DISTINCT(txi.id)) FROM mjr_transaction_item txi INNER JOIN mjr_agent agnt ON agnt.code = txi.src_id OR agnt.code = txi.dest_id WHERE agnt.agent_group = 0Итак, я выбрал второй вариант.
мы можем просто сделать это.
select * from table1 t, CRM_VCM_CURRENT_LEAD_STATUS c WHERE t.CM_PLAN_ID = c.CRM_VCM_CURRENT_LEAD_STATUS and t.Individual_ID = c.Individual_ID
Я создал проще
Select * from table1 WHERE (convert(VARCHAR,CM_PLAN_ID) + convert(VARCHAR,Individual_ID)) IN ( Select convert(VARCHAR,CM_PLAN_ID) + convert(VARCHAR,Individual_ID) From CRM_VCM_CURRENT_LEAD_STATUS Where Lead_Key = :_Lead_Key )надеюсь, что это поможет :)
простым и неправильным способом было бы объединить два столбца с помощью + или объединить и сделать один столбец.
Select * from XX where col1+col2 in (Select col1+col2 from YY)Это было бы конечно очень медленно. Не может быть использован в программировании, но если в случае, если вы просто запрашиваете для проверки что-то может быть использовано.
Comments