3

これら 2 つのステートメントを 1 つに結合しようとしましたが、すべて失敗しました。それらをマージすることは可能ですか?

-- 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
4

2 に答える 2

1

2 つの結果を 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

回答がない場合、2 番目の値は NULL になります。

2行を返すことについて。私の推測ではsubject、それは文字列hasAnsweredComですが、整数です。型が競合するため、何らかのunion結果をまとめると、おそらく 2 行目で型の競合が発生します。

于 2013-04-17T13:14:49.477 に答える
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')
)
于 2013-04-17T12:21:53.430 に答える