maysamfth Ответов: 2

Как использовать несколько наборов данных в предложении WHERE и 'in'


Привет У меня есть две таблицы с основными подробными данными:

мастер:
id -- no -- buyer -- active
1 -- 123 -- aaa -- True
2 -- 124 -- bbb -- False

...

деталь:
id -- masterID -- sellDetail -- status
1 --      1   --    orange   --   1
2 --      1   --    apple    --   2
3 --      1   --    potato   --   0
4 --      1   --    banana   --   4

...

Я хочу, когда учитель ряду активных (Active=истина), затем выберите записей подчиненной таблицы, что состояние (0, 1 , 2) и если мастер строка выключена (actvie=false), то выбрать записи, что состояние (0, 1, 4).
статус-это smallint.

Что я уже пробовал:

select * 
from detail
    LEFT OUTER JOIN master ON detail.masterID = master.id 
WHERE status IN (case when master.active='true' then '0,1,2' else '0,1,4' end)


но есть ошибка: ошибка преобразования в тип varchar значение '0,1,2' в smallint тип данных.

2 Ответов

Рейтинг:
18

OriginalGriff

IN неудобен, потому что он обрабатывается в неправильной точке: он ожидает коллекцию элементов, а не строку, и отказывается иметь с ней что-либо общее. Есть способы обойти это, но они, как правило, становятся сложными и неэффективными довольно быстро: Использование разделенных запятыми строк параметров значений в предложениях SQL IN[^]

Попробовать это:

...
WHERE (master.active='true' AND status IN (0,1,2))
   OR (master.active!='true' AND status IN (0,1,4))


Maciej Los

5ed!

Рейтинг:
1

Maciej Los

Еще один способ это создать вспомогательную таблицу:

--single operation!!!
CREATE TBALE MasterDetailHelper
{
    [active] BOOL,
    [status] INT
};

INSERT INTO MasterDetailHelper ([active], [status])
VALUES('true', 0), ('true', 1), ('true', 2),
('false', 0), ('false', 1), ('false', 4)


Затем:

SELECT m.*, md.*
FROM Mster m 
    INNER JOIN MasterDetail md ON m.id = md.masterid
    INNER JOIN MasterDetailHelper mdh ON m.active = mdh.active AND md.status = mdh.status


Он должен выполнять свою работу без использования WHERE оговорка!

Для получения более подробной информации, пожалуйста, смотрите: Визуальное представление SQL-соединений[^]