2016-08-25 63 views
1

我使用SQL Server 2014有两个表:ApplicationProjectLOV_SIP_ALLSTAFFSQL 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和类型是AA类型(即hoho2,和8)必须显示的信息,并且如果类型是L然后它james1,和5绝被显示。

我试图用UNIONUNION ALL在一个查询运行两个SELECT语句,但它只是基于该查询返回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

根据提供的答案,它不使用绑定到查询的模型。例如,Name of LiaisonOfficer,但对于Type A,它是Name ofAlternateLisisonOfficer。如果我只是使用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呢?我根据ApplicationProjectLO中的类型'A'或'L'返回来自同一个表V_SIP_ALLSTAFF的值。 – user3807187

+0

@ user3807187哦,这比我预期的更简单。检查更新后的答案 – Backs

+0

hI,谢谢。但是,它只返回类型L的值。 – user3807187

0

您需要JOIN,而不是UNIONJOIN根据共同的keyfield(s)合并来自两个表格的列。

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

只需问心无愧分配的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,请检查我更新后的帖子。谢谢。 – 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,请检查我更新后的帖子。谢谢。 – user3807187