Только одно выражение может быть указано в списке выбора, когда подзапрос не введен с EXISTS - в случае, когда подзапросы - PullRequest
0 голосов
/ 07 октября 2019

Я создаю программу на VBA, которая генерирует файлы доступа для разных стран. Каждой стране нужны разные сегменты в своем файле доступа, поэтому я должен сгенерировать эти файлы для конкретной страны. Мои данные поступают с MS SQL Server, и после вставки запроса SQL в VBA я получил ошибку ODBC, поэтому я решил сначала решить проблему на стороне SQL. Коды vba проходят по entity_id-s в таблице tbl_entity с помощью цикла for (у меня есть страны в этой таблице) и проверяют их entity_ID-s. В зависимости от их entity_ID у них будут требуемые Segment_ID.

Вот мой код в SQL:

select case when b.entity_id = 7 then (select Segment_ID, Segment_name as Segment, explanation from sclr.Tbl_Segment where segment_id in (4, 5, 13)) 
            when b.entity_id = 25 then (select Segment_ID, Segment_name as Segment, explanation from sclr.Tbl_Segment where segment_id in (4, 1, 13)) 
            when b.entity_id = 462 then (select Segment_ID, Segment_name as Segment, explanation from sclr.Tbl_Segment where segment_id in (4, 8, 13)) 
            when b.entity_id = 12 then (select Segment_ID, Segment_name as Segment, explanation from sclr.Tbl_Segment where segment_id in (4, 1, 11, 12, 13)) 
            when b.entity_id = 13 then (select Segment_ID, Segment_name as Segment, explanation from sclr.Tbl_Segment where segment_id in (4, 1, 11, 12, 13, 7)) 
            when b.entity_id = 24 then (select Segment_ID, Segment_name as Segment, explanation from sclr.Tbl_Segment where segment_id in (4, 1, 11, 13, 9, 10))
            else (select Segment_ID, Segment_name as Segment, explanation from sclr.Tbl_Segment where segment_id in (4, 13)) end  
from (select * from sclr.Tbl_entity where entity_id = 7) b

select * from sclr.Tbl_entity, где entity_id = 7 является частьюв конце приведен лишь пример, потому что версия этого VBA будет выглядеть следующим образом:

strSQL = "select case when " & rsRecSet("Entity_ID") & " = 7 then (select Segment_ID, Segment_name as Segment, explanation from sclr.Tbl_Segment where segment_id in (4, 5, 13)) " 
            strSQL = strSQL & "when " & rsRecSet("Entity_ID") & " = 25 then (select Segment_ID, Segment_name as Segment, explanation from sclr.Tbl_Segment where segment_id in (4, 1, 13)) " 
            strSQL = strSQL & "when " & rsRecSet("Entity_ID") & " = 462 then (select Segment_ID, Segment_name as Segment, explanation from sclr.Tbl_Segment where segment_id in (4, 8, 13)) " 
            strSQL = strSQL & "when " & rsRecSet("Entity_ID") & " = 12 then (select Segment_ID, Segment_name as Segment, explanation from sclr.Tbl_Segment where segment_id in (4, 1, 11, 12, 13)) " 
            strSQL = strSQL & "when " & rsRecSet("Entity_ID") & " = 13 then (select Segment_ID, Segment_name as Segment, explanation from sclr.Tbl_Segment where segment_id in (4, 1, 11, 12, 13, 7)) " 
            strSQL = strSQL & "when " & rsRecSet("Entity_ID") & " = 24 then (select Segment_ID, Segment_name as Segment, explanation from sclr.Tbl_Segment where segment_id in (4, 1, 11, 13, 9, 10)) " 
            strSQL = strSQL & "else (select Segment_ID, Segment_name as Segment from sclr.Tbl_Segment, explanation where segment_id in (4, 13)) end into tmp_segment from sclr.Tbl_segment c "
            '--ODBC CALL FAILED

            Set qsQuery = dbSet.CreateQueryDef("")
            qsQuery.Connect = ConnectionString
            qsQuery.ReturnsRecords = False
            qsQuery.SQL = strSQL
            qsQuery.Execute

Как вы можете видеть, к операторам when будет добавлено значение набора записей, и операторы выбора должнызапустить на основе этого. В VBA я получаю сообщение об ошибке «Не удалось вызвать ODBC», вызванное неправильным запросом, а в SQL «У меня может быть указано только одно выражение в списке выбора, если подзапрос не введен с EXISTS». ошибка.

Может кто-нибудь посоветовать, пожалуйста?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...