2013-09-24 3 views
5

Привет каждый я хочу использовать случае заявление в объединение, используя этот запрос и получил ошибкуUse Case Заявление Присоединитесь

Select CONVERT(VARCHAR(10), SII.SIDATE,103)DATE,SII.SALEID,SII.ItemName,SI.TenancyID 

FROM F_SALESINVOICEITEM SII 
INNER JOIN F_SALESINVOICE SI ON SI.SALEID=SII.SALEID 
INNER JOIN #TempTableSearch ts ON CASE 
WHEN ts.ACCOUNTTYPE = '1' THEN ts.ACCOUNTID=SI.TENANCYID 
    WHEN ts.ACCOUNTTYPE='2' THEN ts.ACCOUNTID=SI.EMPLOYEEID 
    WHEN ts.ACCOUNTTYPE='3' THEN ts.ACCOUNTID=SI.SUPPLIERID 
    WHEN ts.ACCOUNTTYPE='4' THEN ts.ACCOUNTID=SI.SALESCUSTOMERID 

Ошибка

Неправильный синтаксис около «=».

Пожалуйста, помогите решить эту проблему.

ответ

13

IT должно быть,

ON 
ts.ACCOUNTID = CASE 
        WHEN ts.ACCOUNTTYPE = '1' THEN SI.TENANCYID 
        WHEN ts.ACCOUNTTYPE = '2' THEN SI.EMPLOYEEID 
        WHEN ts.ACCOUNTTYPE = '3' THEN SI.SUPPLIERID 
        WHEN ts.ACCOUNTTYPE = '4' THEN SI.SALESCUSTOMERID 
       END 
0

У вас есть ошибка синтаксиса. Вам не хватает END.

6

Вместо того, чтобы использовать случай, я бы предпочел сделать это:

Select CONVERT(VARCHAR(10), SII.SIDATE,103)DATE,SII.SALEID,SII.ItemName,SI.TenancyID 
FROM F_SALESINVOICEITEM SII 
INNER JOIN F_SALESINVOICE SI ON SI.SALEID=SII.SALEID 
INNER JOIN #TempTableSearch ts ON 
     (ts.ACCOUNTTYPE='1' AND ts.ACCOUNTID=SI.TENANCYID) 
    OR (ts.ACCOUNTTYPE='2' AND ts.ACCOUNTID=SI.EMPLOYEEID) 
    OR (ts.ACCOUNTTYPE='3' AND ts.ACCOUNTID=SI.SUPPLIERID) 
    OR (ts.ACCOUNTTYPE='4' AND ts.ACCOUNTID=SI.SALESCUSTOMERID) 

Чтобы объяснить, почему запрос не работает для вас: синтаксис CASE требует END в конце статьи , Это будет работать, как предлагают другие предлагаемые решения, но я считаю эту версию более удобной для понимания - хотя эта часть очень субъективна.

+0

Вы выполнили запрос, но вы точно не объяснили, в чем причина ошибки. – nimdil

1

вы можете сделать это, так что у вас нет никаких шансов орфографической ошибки что-то (обратите внимание, что ACCOUNTTYPE и ACCOUNTID используются только при необходимости, вы не должны копировать-вставить)

select 
    convert(varchar(10), SII.SIDATE,103) as DATE, 
    SII.SALEID, SII.ItemName, SI.TenancyID 
from F_SALESINVOICEITEM as SII 
    inner join F_SALESINVOICE as SI on SI.SALEID = SII.SALEID 
    outer apply (
     '1', SI.TENANCYID 
     '2', SI.EMPLOYEEID 
     '3', SI.SUPPLIERID 
     '4', SI.SALESCUSTOMERID 
    ) as C(ACCOUNTTYPE, ACCOUNTID) 
    inner join #TempTableSearch as ts on 
     ts.ACCOUNTTYPE = C.ACCOUNTTYPE and ts.ACCOUNTID = C.ACCOUNTID 
0

Вы должны понимать, что CASE ... END блок НЕ эквивалентен IF { } из C-подобных языков. Скорее всего, это эквивалентно сложной версии оператора ... ? ... : ... из C-подобных языков. Что это означает, что блок WHOLE CASE должен, по существу, оценивать одно значение и что это значение должно быть одного и того же типа независимо от того, в каком случае выполняется блок. Это означает, что:

CASE 
WHEN ts.ACCOUNTTYPE = '1' THEN ts.ACCOUNTID=SI.TENANCYID ... 
END 

принципиально неправильно, если вы работаете на версию базы данных, которая позволит вам BOOL значения в качестве значения (SQL Server не позволят, например, но я думаю, что некоторые версии MySQL используется для разрешите это - не уверен в этом). Вы, наверное, должны написать что-то вроде:

CASE 
WHEN ts.ACCOUNTTYPE = '1' AND ts.ACCOUNTID=SI.TENANCYID THEN 1 
WHEN ts.ACCOUNTTYPE='2' AND ts.ACCOUNTID=SI.EMPLOYEEID THEN 1 
WHEN ts.ACCOUNTTYPE='3' AND ts.ACCOUNTID=SI.SUPPLIERID THEN 1 
WHEN ts.ACCOUNTTYPE='4' AND ts.ACCOUNTID=SI.SALESCUSTOMERID THEN 1 
ELSE 0 
END = 1 

Обратите внимание, как весь CASE блок оценивает в 1 или 0, а затем сравнивается с 1. Конечно, вместо 4 WHEN «s вы можете использовать один WHEN с комбинацией AND , OR и () скобки. Конечно, в этом конкретном случае ответ @ppeterka 66 верен, так как CASE не подходит для того, что вы действительно хотели сделать - я просто пытаюсь выяснить, что такое CASE.