MS SQL Найти значение во всем столбце и вернуть true, если найдено - PullRequest
0 голосов
/ 23 марта 2020

Новичок в SQL, пытаясь найти способ сделать следующее:

У меня есть ProductID # ABC123 (Product) Мне нужно проверить столбец «workflow» (Рабочий процесс) и посмотреть, если ID продукта когда-либо был «расширен» - есть различные этапы рабочего процесса - нужно проверить весь столбец рабочего процесса, если ProductID когда-либо был «расширен», мне нужно отметить «да»

Пример:

Product ID    Workflow Extended?    
-------------------------------
ABC123        "Yes"
ABC234        "No"
ABC345        "Yes"

Пожалуйста, помогите!

Ответы [ 3 ]

0 голосов
/ 23 марта 2020

Если вы хотите узнать, был ли продукт когда-либо расширен, это означает, что его нужно продлить хотя бы один раз. И это означает, что просто одна строка должна быть помечена как расширенная.

(SELECT COUNT(*) FROM YourProductTable WHERE ProductID = 'ABC123' AND Extended = 'Yes') > 0 
--it will return true or false. If true, it means at least one line is marked as Yes.

Если вам нужно знать, все ли строки рассматриваемого продукта помечены как Да, чтобы проверить столбец worwkflow:

(SELECT COUNT(*) FROM YourProductTable WHERE ProductID = 'ABC123' AND Extended <> 'Yes') > 0 

ИЛИ

 (SELECT COUNT(*) FROM YourProductTable WHERE ProductID = 'ABC123' AND Extended = 'No') > 0 
--Will return true if there is a line marked as No.
0 голосов
/ 23 марта 2020

Обычно вы выбираете продукты из таблицы продуктов, а затем проверяете, есть ли для них расширенная запись в таблице шагов рабочего процесса. Это делается с помощью IN или EXISTS.

select
  product_id,
  name,
  case when product_id in
              (select product_id from workflow_steps where workflow = 'extended')
       then 'yes'
       else 'no'
  end as extended
from products
order by product_id;

. Это позволяет избежать необходимости читать все строки из (возможно, большой) таблицы шагов рабочего процесса. Эта таблица должна иметь индекс по двум интересующим нас столбцам, чтобы поиск происходил быстро. Думаю, порядок двух столбцов не должен иметь значения, но вы можете быть осторожны и создать оба индекса. Затем в плане выполнения запроса проверьте, какой индекс используется, и отбросьте другой:

create index idx1 on workflow_steps(product_id, workflow);
create index idx2 on workflow_steps(workflow, product_id);
0 голосов
/ 23 марта 2020

Вы можете использовать агрегацию:

select product_id, max(workflow_extended) workflow_extended_once
from mytable
group by product_id

Это работает, потому что для строки 'Yes' больше, чем 'No': так что если данный product_id имеет хотя бы один 'Yes' , столбец workflow_extended_once будет отображать 'Yes'. Если он имеет только 'No' s, будет возвращено 'No'.

** Edit **

Похоже, что вы хотите:

select 
    product_id, 
    max(case when workflow = 'extended' then 'Yes' else 'No' end) workflow_extended_once
from mytable
group by product_id
...