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 или более столбцов с другим внутренним выбором?

426   12  

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 = 91800

1.С помощью 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

    Ничего не найдено.