Как написать, если существует оператор, который будет запускать другой выбор в зависимости от того, существует он или нет - PullRequest
0 голосов
/ 21 мая 2019

Я пытаюсь преобразовать оператор sql if exists в допустимый формат SSRS для запуска отчета в CRM.

Отчет CRM не принимает отчет о загрузке, если у меня есть метод if exists, у меня проблемы с выяснением, что я могу использовать вместо него.

IF EXISTS(select * from dbo.FC where dbo.FC.ContactID in (select dbo.AV.so_contactid from dbo.AV))
begin
    select [STATEMENT 1]
    from dbo.AV CRMAF_so_AV join
         dbo.FC c 
        on CRMAF_so_AV.so_contactid = c.ContactID;
end
else
begin
    select [STATEMENT 2]
    from dbo.AV CRMAF_so_AV join
         dbo.FA c
         on CRMAF_so_AV.so_contactid = c.AccountID;

end;

Я хочу иметь возможность запустить select [STATEMENT 1], если условие истинно, иначе я хочу запустить select [STATEMENT 2]

Ответы [ 5 ]

1 голос
/ 24 мая 2019

Мне удалось заставить это работать, выполнив LEFT JOIN вместо JOIN.

select [STATEMENT 1 + 2 all columns needed]
from dbo.AV CRMAF_so_AV 
left join dbo.FC c on CRMAF_so_AV.so_contactid = c.ContactID;
left join dbo.FA a on CRMAF_so_AV.so_contactid = a.AccountID;

Это теперь работает, если это учетная запись или контакт.

0 голосов
/ 23 мая 2019

Несколько вещей на заметку: Когда SSRS оценивает запрос, он ожидает, что результаты всегда будут иметь одинаковую структуру с точки зрения имен и типов столбцов.

Так что вы НЕ МОЖЕТЕ сделать что-то вроде этого ..

IF @x=@y
    BEGIN
        SELECT Name, Age FROM employees
    END
ELSE
    BEGIN
        SELECT DeptID, DeptName, DeptEMpCOunt FROM departments
    END

... так как это вернет разные типы и имена столбцов и количество столбцов.

Что вы можете сделать, это ..

DECLARE @t TABLE(resultType int, colA varchar(128), colB int, colC varchar(128), colD int)
IF @x=@y
    BEGIN
        INSERT INTO @t(resultType, colA, ColB)
        SELECT 1 as resultType, Name, Age FROM employees
    END
ELSE
    BEGIN
        INSERT INTO @t(resultType, colB, colC, colD)
        SELECT 2 AS resultType, DeptID, DeptName, DeptEmpCount FROM departments
    END

SELECT * FROM @t

Все, что мы делаем, - это создание таблицы, которая может обрабатывать все варианты данных, и размещение результатов в любых столбцах, в которых можно разместить этот тип данных.

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

0 голосов
/ 21 мая 2019

Я думаю, вам нужно что-то вроде этого:

WITH PreSelection AS (
  SELECT 
    AV.ID AS AVID, 
    (SELECT TOP(1) c.ContactID FROM dbo.FC c WHERE c.ContactID = AV.so_contactid) AS ContactID, 
    (SELECT TOP(1) c.ContactID FROM dbo.FA c WHERE c.AccountID = AV.so_contactid) AS AccountID 
  FROM dbo.AV
)

SELECT
  AVID,
  ISNULL(
    CASE WHEN ContactID IS NULL 
    THEN (SELECT TOP(1) AccountName FROM dbo.FA WHERE FA.AccountID = AccountID)
    ELSE (SELECT TOP(1) LTRIM(RTRIM(ISNULL(FirstName, '') + ' ' + ISNULL(LastName, ''))) FROM dbo.FC WHERE FC.ContactID = ContactID)
    END, '') AS ContactName
FROM PreSelection
0 голосов
/ 21 мая 2019

Вместо использования, если существует, вы не можете получить количество записей, которые соответствуют критериям, а затем, если его 1 или больше, выполнить другой запрос, как если бы он был равен 0.

, дайте мне знатьесли я что-то упускаю, чего вы пытаетесь достичь.

извините, я не могу оставлять комментарии из-за новой учетной записи, поэтому моя репутация низкая.

0 голосов
/ 21 мая 2019

Попробуйте это -

Вы должны поместить все ваше заявление в @select1 и @select1.

declare @statement1 as varchar(max);
declare @statement2 as varchar(max);

SET @statement1 = 'SELECT 1'
SET @statement2 = 'SELECT 2'

IF EXISTS(select * from dbo.FC where dbo.FC.ContactID in (select dbo.AV.so_contactid from dbo.AV))

    BEGIN
        EXEC (@statement1)
    END

ELSE 

    BEGIN
        EXEC (@statement2)
    END
...