2013-04-17 2 views
3

Я пытаюсь объединить эти два утверждения с одним, но все мои попытки не удались! Можно ли их объединить?TSQL - TOP и COUNT в одном SELECT

-- Is there a open answer? 
SELECT CASE COUNT(tbl_Communication.pk_Communication) WHEN 0 
     THEN 0 ELSE 1 END AS hasAnsweredCom 
FROM tbl_Communication 
JOIN tbl_CommunicationElements ON tbl_CommunicationElements.pk_Communication = tbl_Communication.pk_Communication 
WHERE tbl_Communication.pk_Ticket = @pk_Ticket 
    AND tbl_Communication.isClosed = 0 
    AND tbl_Communication.pk_CommunicationType = (SELECT pk_CommunicationType 
               FROM tbl_CommunicationType 
               WHERE name = 'query') 

-- Get the answer text 
SELECT TOP 1 tbl_Communication.subject AS hasAnsweredComStepName 
FROM tbl_Communication 
JOIN tbl_CommunicationElements ON tbl_CommunicationElements.pk_Communication = tbl_Communication.pk_Communication 
WHERE tbl_Communication.pk_Ticket = @pk_Ticket 
    AND tbl_Communication.isClosed = 0 
    AND tbl_Communication.pk_CommunicationType = (SELECT pk_CommunicationType 
               FROM tbl_CommunicationType 
               WHERE name = 'query') 
ORDER BY tbl_Communication.pk_Communication 
+1

'ТОП 1' заказал что? Также смотрите 'CASE WHEN EXISTS', а не считая их всех и устанавливая флаг, если он равен нулю. –

+0

Зачем нужен заказ? оба оператора приведут к 1 единственной строке/полю. – MacTee

+0

@ Эйхенвальд: Да, но второй нужен «ТОП-1», который предполагает, что существует несколько строк, поэтому вы должны их заказать, иначе выход непредсказуем. Даже если это не имеет значения для вас (сейчас), это плохая привычка пропускать «ЗАКАЗАТЬ». –

ответ

1

Правильный трюк.

SELECT TOP 1 
    CASE WHEN tbl_CommunicationElements.pk_Communication IS NULL THEN 0 ELSE 1 END hasAnsweredCom 
    , tbl_Communication.subject AS hasAnsweredComStepName 
FROM tbl_Communication 
JOIN tbl_CommunicationElements ON tbl_CommunicationElements.pk_Communication = tbl_Communication.pk_Communication 
RIGHT JOIN (VALUES(1)) AS Ext(x) ON (
    tbl_Communication.pk_Ticket = @pk_Ticket 
    AND tbl_Communication.isClosed = 0 
    AND tbl_Communication.pk_CommunicationType = (SELECT pk_CommunicationType 
               FROM tbl_CommunicationType 
               WHERE name = 'query') 
) 
+0

thx, но это не сработает, потому что 'tbl_CommunicationElements.pk_Communication' не может быть NULL, и это должно быть' tbl_Communication'. – MacTee

+0

это внешнее соединение, поэтому tbl_CommunicationElements.pk_Communication будет null, когда hasAnsweredCom = 0 – Serge

+0

wow, я не понимаю, что здесь происходит, но он работает;) thx alot! – MacTee

1

Если вы готовы поставить два результата на одной линии, следующие виды работ:

select (CASE count(*) WHEN 0 THEN 0 ELSE 1 END) AS hasAnsweredCom, 
     MAX(case when seqnum = 1 then subject end) as hasAnsweredComStepName 
from (SELECT tbl_Communication.pk_Communication, tbl_Communication.subject, 
      ROW_NUMBER() over (order by pk_communication) as seqnum        
     FROM tbl_Communication 
     JOIN tbl_CommunicationElements ON tbl_CommunicationElements.pk_Communication = tbl_Communication.pk_Communication 
     WHERE tbl_Communication.pk_Ticket = @pk_Ticket 
     AND tbl_Communication.isClosed = 0 
     AND tbl_Communication.pk_CommunicationType = (SELECT pk_CommunicationType 
                 FROM tbl_CommunicationType 
                 WHERE name = 'query') 
    ) t 

Второе значение будет NULL, если нет ответа.

Что касается возврата двух рядов. Я предполагаю, что subject является строкой, тогда как hasAnsweredCom является целым числом. Типы конфликтуют, поэтому любой вид union или приведение результатов вместе приведет к конфликту типа во второй строке.

+0

thx вам тоже !!! это тоже работает – MacTee

Смежные вопросы