2016-08-25 3 views
1

Я использую SQL Server 2014 и имеют два стола: ApplicationProjectLO и V_SIP_ALLSTAFF:SQL UNION не работает

Таблица ApplicationProjectLO:

|---------------------|---------------------------| 
|  StaffEmailId |    Type   | 
|---------------------|---------------------------| 
|  chinkim1  |    L   | 
|---------------------|---------------------------| 
|  kandiah1  |    A   | 
|---------------------|---------------------------| 

Таблица V_SIP_ALLSTAFF

|---------------------|----------------|-------------------|---------------| 
|  lOGINID  | displayname | Email Address |MainOfficeTelNo| 
|---------------------|----------------|---------------- |-------------- | 
|  chinkim1  | james  |  1   |  5  | 
|---------------------|----------------|---------------- |---------------| 
|  kandiah1  | hoho  |  2   |  8  | 
|---------------------|----------------|---------------- |---------------| 

Я хотел бы отобразить информацию на основе «Тип».

Так что, если StaffEmailId соответствует LONGINID и тип A, информация о типе A (то есть hoho, 2 и 8) должны быть отображены, и если тип L то james, 1 и 5 сусло будет отображаться.

Я пытался использовать UNION и UNION ALL запустить два оператора выбора в одном запросе, но он возвращает только type=L результат на основе этого запроса:

SELECT 
    vsa.displayname NameofLiaisonOfficer, 
    vsa.EmailAddress LOEmail, 
    '(65)' +' '+ convert(varchar, vsa.MainOfficeTelNo) as LOContactNo, 
    vsa.MainOfficeTelNo GeneralOfficeConatctNo 
FROM ApplicationProjectLo ap 
INNER JOIN V_SIP_ALLSTAFF vsa ON ap.StaffEmailId = vsa.LOGINID 
WHERE ap.Type = 'L' 

UNION ALL 

SELECT 
    vsa.displayname NameofAlternateLiaisonOfficer, 
    vsa.EmailAddress AlternateLOEmail, 
    '(65)' +' '+ convert(varchar, vsa.MainOfficeTelNo) as AlternateLOContactNo, 
    vsa.MainOfficeTelNo GeneralOfficeConatctNo 
FROM ApplicationProjectLo ap 
INNER JOIN V_SIP_ALLSTAFF vsa ON ap.StaffEmailId = vsa.LOGINID 
WHERE ap.Type = 'A' 

MVC Вид:

<tr> 
    <td colspan="3"> 
     <strong>Name of Liaison Officer</strong> 
     <br /> 
     <br /> @Html.DisplayFor(m => m.TPInformationDetails.NameofLiaisonOfficer) 
    </td> 
    @* 
    <td> 
     <strong>Room Number</strong> 
     <br /> 
     <br /> 
    </td>*@ 
    <td> 
     <strong>Contact Number</strong> 
     <br /> 
     <br /> @Html.DisplayFor(m => m.TPInformationDetails.LOContactNo) 
    </td> 
    <td> 
     <strong>Email Address</strong> 
     <br /> 
     <br /> @Html.DisplayFor(m => m.TPInformationDetails.LOEmail) 
    </td> 
</tr> 
<!-- Table Row --> 
<tr class="even"> 
    <td colspan="3"> 
     <strong>Name of Alternate Liaison Officer</strong> 
     <br /> 
     <br /> @Html.DisplayFor(m => m.TPInformationDetails.NameofAlternateLiaisonOfficer) 
    </td> 
    <td> 
     <strong>Contact Number</strong> 
     <br /> 
     <br /> @Html.DisplayFor(m => m.TPInformationDetails.AlternateLOContactNo) 
    </td> 
    <td> 
     <strong>Email Address</strong> 
     <br /> 
     <br /> @Html.DisplayFor(m => m.TPInformationDetails.AlternateLOEmail) 
    </td> 
</tr> 
<!-- Table Row --> 
+0

Почему вы используете союз вместо присоединиться? – Zeina

+1

Можете ли вы сначала изолировать проблему. Связан ли MVC? – qxg

+0

На основе предоставленного ответа он не использует модель, которая привязана к запросу. Например, NameofLiaisonOfficer, но для типа «А» это NameofAlternateLiaisonOfficer. Если я просто использую NameofLiaisonOfficer и привяжу к представлению, он отобразит тот же результат. – user3807187

ответ

0
const string _sqlODetails = @"SELECT vsa.displayname NameofLiaisonOfficer, 
               vsa.EmailAddress LOEmail, 
               '(65)' +' '+ convert(varchar, vsa.MainOfficeTelNo) as LOContactNo, 
               vsa.MainOfficeTelNo GeneralOfficeConatctNo 
              FROM ApplicationProjectLo ap 
              INNER JOIN V_SIP_ALLSTAFF vsa ON ap.StaffEmailId = vsa.LOGINID 
              WHERE ap.Type = 'L'"; 

      using (var connection = Db.SqlServer()) 
      { 
       tpOdetails = connection 
        .Query<TPInformationDetails>(_sqlODetails) 
        .FirstOrDefault(); 
      } 

      const string _sqlADetails = @"SELECT vsa.displayname NameofAlternateLiaisonOfficer, 
                vsa.EmailAddress AlternateLOEmail, 
                '(65)' +' '+ convert(varchar, vsa.MainOfficeTelNo) as AlternateLOContactNo, 
                vsa.MainOfficeTelNo GeneralOfficeConatctNo 
              FROM ApplicationProjectLo ap 
              INNER JOIN V_SIP_ALLSTAFF vsa ON ap.StaffEmailId = vsa.LOGINID 
              WHERE ap.Type = 'A'"; 

      using (var connection = Db.SqlServer()) 

      { 
       tpAdetails = connection 
        .Query<TPInformationDetails>(_sqlADetails) 
        .FirstOrDefault(); 
      } 
0
SELECT 
    vsa.displayname NameofLiaisonOfficer, 
    vsa.EmailAddress LOEmail, 
    '(65)' +' '+ convert(varchar, vsa.MainOfficeTelNo) as LOContactNo, 
    vsa.MainOfficeTelNo GeneralOfficeConatctNo 
FROM ApplicationProjectLo ap 
INNER JOIN V_SIP_ALLSTAFF vsa ON ap.StaffEmailId = vsa.LOGINID 
WHERE ap.Type IN ('A', 'L') 
+0

Это означает, что я только возвращаю значения из L, а что касается A? Я возвращаю значения из той же таблицы V_SIP_ALLSTAFF на основе типа «A» или «L» в ApplicationProjectLO. – user3807187

+0

@ user3807187 о, это проще, чем я ожидал. проверьте обновленный ответ – Backs

+0

hI, спасибо. Однако он возвращает только значения типа L. – user3807187

0

Вам нужен JOIN, а не UNION. JOIN сочетает столбцы из двух таблиц на основе общих keyfield(s).

SELECT a.field1, b.field1, b.field2 FROM table1 a JOIN table2 b ON a.keyfield=b.keyfield; 
0

Просто обойтись WTH в WHERE:

SELECT vsa.displayname as NameofLiaisonOfficer, 
     vsa.EmailAddress LOEmail, 
     '(65)' +' '+ convert(varchar, vsa.MainOfficeTelNo) as LOContactNo, 
     vsa.MainOfficeTelNo GeneralOfficeConatctNo 
FROM ApplicationProjectLo ap INNER JOIN 
     V_SIP_ALLSTAFF vsa 
     ON ap.StaffEmailId = vsa.LOGINID; 

Или использовать WHERE который включает в себя оба типа:

SELECT vsa.displayname as NameofLiaisonOfficer, 
     vsa.EmailAddress LOEmail, 
     '(65)' +' '+ convert(varchar, vsa.MainOfficeTelNo) as LOContactNo, 
     vsa.MainOfficeTelNo GeneralOfficeConatctNo 
FROM ApplicationProjectLo ap INNER JOIN 
     V_SIP_ALLSTAFF vsa 
     ON ap.StaffEmailId = vsa.LOGINID; 
WHERE ap.Type IN ('A', 'L'); 

Тем не менее, остается неясным, почему ваш запрос - хотя сверх- сложный - не возвращает оба типа. Одна из возможностей заключается в том, что вы используете национальный набор символов, а «A» на самом деле не «A».

+0

hI, спасибо. Однако он возвращает только значения типа L. – user3807187

+0

Привет, это приведет к таким же значениям. Я использую MVC, pplease проверяю мой обновленный пост. Благодарю. – user3807187

0

Используйте приведенный ниже запрос, чтобы отобразить результат с типом 'L' и 'A'.

SELECT 
    vsa.displayname NameofLiaisonOfficer, 
    vsa.EmailAddress LOEmail, 
    '(65)' +' '+ convert(varchar, vsa.MainOfficeTelNo) as LOContactNo, 
    vsa.MainOfficeTelNo GeneralOfficeConatctNo 
FROM ApplicationProjectLo ap 
INNER JOIN V_SIP_ALLSTAFF vsa ON ap.StaffEmailId = vsa.LOGINID 
WHERE ap.Type IN ('L','A') 
ORDER BY ap.Type desc 
+0

Привет, это приведет к таким же значениям. Я использую MVC, pplease проверяю мой обновленный пост. Благодарю. – user3807187