Нужна помощь со сложным регистром SQL 2005 - PullRequest
1 голос
/ 06 января 2011

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

Логика не вызывает сомнений, но, похоже, синтаксис неправильный.Это дает мне ошибки с «Неверный синтаксис рядом с ключевыми словами« Case »,« Else »,« Else ».Идея состоит в том, чтобы вставить адрес в таблицу, если isprimary = 1, если нет первичной вставки, самый последний адрес, который активен = 1, если нет активного, то вставьте самый последний адрес.


- Выберите один лучший адрес для записи 02

DECLARE @ygcaddress TABLE
(
[AccountID] varchar(10),
[Address1] varchar(25),
[City] varchar(22),
[State] varchar(3),
[Zip] varchar(9)
)
INSERT INTO @ygcaddress
CASE
WHEN Address.IsPrimary=1
THEN 
SELECT
LEFT(Address.AddressLine1,25),
Address.City,
[Lookup].LookupValue,
Address.Zip
FROM (((AccountPerson INNER JOIN Account ON AccountPerson.AccountID=Account.AccountID)
INNER JOIN Address ON AccountPerson.PersonID=Address.PersonID)
INNER JOIN @ygcaddress y ON Account.AccountID=y.AccountID)
INNER JOIN [Lookup] ON Address.StateID=[Lookup].LookupID
WHERE Address.IsPrimary=1
ELSE
CASE
WHEN Address.IsActive=1
THEN
SELECT TOP 1
LEFT(Address.AddressLine1,25),
Address.City,
[Lookup].LookupValue,
Address.Zip
FROM (((AccountPerson INNER JOIN Account ON AccountPerson.AccountID=Account.AccountID)
INNER JOIN Address ON AccountPerson.PersonID=Address.PersonID)
INNER JOIN @ygcaddress y ON Account.AccountID=y.AccountID)
INNER JOIN [Lookup] ON Address.StateID=[Lookup].LookupID
WHERE Address.IsActive=1
ELSE
SELECT TOP 1
LEFT(Address.AddressLine1,25),
Address.City,
[Lookup].LookupValue,
Address.Zip
FROM (((AccountPerson INNER JOIN Account ON AccountPerson.AccountID=Account.AccountID)
INNER JOIN Address ON AccountPerson.PersonID=Address.PersonID)
INNER JOIN @ygcaddress y ON Account.AccountID=y.AccountID)
INNER JOIN [Lookup] ON Address.StateID=[Lookup].LookupID
END
END

Ответы [ 4 ]

0 голосов
/ 06 января 2011

Если я правильно понял проблему, я не думаю, что вам вообще нужен оператор CASE: оператор CASE возвращает выражение значения, а не кортеж, который вы пытаетесь сделать. (По крайней мере, в SQL Server, который является базой данных SQL, с которой я больше всего знаком)

ИЗМЕНЕНО для удаления моего первого предложенного решения с использованием UNION, которое, как я понял, было неверным.

Снова отредактировано:

Попробуйте что-то вроде этого:

INSERT INTO @ygcaddress 
SELECT
     Account.AccountID
    ,LEFT(Address.AddressLine1,25)
    ,Address.City
    ,[Lookup].LookupValue
    ,Address.Zip 
FROM AccountPerson 
INNER JOIN Account ON AccountPerson.AccountID=Account.AccountID
INNER JOIN 
(
    SELECT TOP 1 
    A1.*
    CASE 
        WHEN A1.IsPrimary=1 THEN 10
        WHEN A1.IsPrimary=0 AND A1.IsActive=1 THEN 5
        ELSE 1
    END [Rank]
    FROM Address A1
    ORDER BY [Rank] DESC
) Address ON AccountPerson.PersonID=Address.PersonID 
INNER JOIN [Lookup] ON Address.StateID=[Lookup].LookupID 
0 голосов
/ 06 января 2011

Попробуйте, насколько я вижу, это выглядит как синтаксическая ошибка в вашем исходном вопросе:

DECLARE @ygcaddress TABLE
(
    [AccountID] varchar(10),
    [Address1] varchar(25),
    [City] varchar(22),
    [State] varchar(3),
    [Zip] varchar(9)
)

INSERT INTO @ygcaddress
    CASE 

        WHEN Address.IsPrimary=1
        THEN 
        SELECT
        LEFT(Address.AddressLine1,25),
        Address.City,
        [Lookup].LookupValue,
        Address.Zip
        FROM (((AccountPerson INNER JOIN Account ON AccountPerson.AccountID=Account.AccountID)
            INNER JOIN Address ON AccountPerson.PersonID=Address.PersonID)
            INNER JOIN @ygcaddress y ON Account.AccountID=y.AccountID)
            INNER JOIN [Lookup] ON Address.StateID=[Lookup].LookupID
            WHERE Address.IsPrimary=1

        WHEN Address.IsActive=1
        THEN
        SELECT TOP 1
        LEFT(Address.AddressLine1,25),
        Address.City,
        [Lookup].LookupValue,
        Address.Zip
        FROM (((AccountPerson INNER JOIN Account ON AccountPerson.AccountID=Account.AccountID)
            INNER JOIN Address ON AccountPerson.PersonID=Address.PersonID)
            INNER JOIN @ygcaddress y ON Account.AccountID=y.AccountID)
            INNER JOIN [Lookup] ON Address.StateID=[Lookup].LookupID
            WHERE Address.IsActive=1

        ELSE
        SELECT TOP 1
        LEFT(Address.AddressLine1,25),
        Address.City,
        [Lookup].LookupValue,
        Address.Zip
        FROM (((AccountPerson INNER JOIN Account ON AccountPerson.AccountID=Account.AccountID)
            INNER JOIN Address ON AccountPerson.PersonID=Address.PersonID)
            INNER JOIN @ygcaddress y ON Account.AccountID=y.AccountID)
            INNER JOIN [Lookup] ON Address.StateID=[Lookup].LookupID
    END
0 голосов
/ 06 января 2011

Не слишком углубляясь в это, вы, по-видимому, упускаете ключевое слово VALUES как минимум. Синтаксис каркаса для оператора INSERT:

INSERT INTO table_name (column1, column2, column3,...)
VALUES (value1, value2, value3,...)

Я бы предложил написать правильный оператор INSERT с буквенными строками (или чем-то еще), прежде чем пытаться заменить что-то более сложное.

0 голосов
/ 06 января 2011

Добавлена ​​скобка для результатов кейса, это должно работать (по крайней мере, синтаксически).

--Select One best address for Record 02 
DECLARE @ygcaddress TABLE ( [AccountID] varchar(10), [Address1] varchar(25), [City] varchar(22), [State] varchar(3), [Zip] varchar(9) ) 
INSERT INTO @ygcaddress 
SELECT 
CASE WHEN Address.IsPrimary=1 THEN 
    (
        SELECT LEFT(Address.AddressLine1,25), Address.City, [Lookup].LookupValue, Address.Zip 
        FROM (((AccountPerson INNER JOIN Account ON AccountPerson.AccountID=Account.AccountID) INNER JOIN Address ON AccountPerson.PersonID=Address.PersonID) INNER JOIN @ygcaddress y ON Account.AccountID=y.AccountID) INNER JOIN [Lookup] ON Address.StateID=[Lookup].LookupID WHERE Address.IsPrimary=1 
    )
ELSE 
    CASE WHEN Address.IsActive=1 THEN 
        (SELECT TOP 1 LEFT(Address.AddressLine1,25), Address.City, [Lookup].LookupValue, Address.Zip FROM (((AccountPerson INNER JOIN Account ON AccountPerson.AccountID=Account.AccountID) INNER JOIN Address ON AccountPerson.PersonID=Address.PersonID) INNER JOIN @ygcaddress y ON Account.AccountID=y.AccountID) INNER JOIN [Lookup] ON Address.StateID=[Lookup].LookupID WHERE Address.IsActive=1 )
    ELSE 
        (SELECT TOP 1 LEFT(Address.AddressLine1,25), Address.City, [Lookup].LookupValue, Address.Zip FROM (((AccountPerson INNER JOIN Account ON AccountPerson.AccountID=Account.AccountID) INNER JOIN Address ON AccountPerson.PersonID=Address.PersonID) INNER JOIN @ygcaddress y ON Account.AccountID=y.AccountID) INNER JOIN [Lookup] ON Address.StateID=[Lookup].LookupID )
    END
END
...