2014-02-06 31 views
0

我有一个存储基本站点信息的表,另一个存储站点地址的表以及第三个电话表。我的电话表包含电话号码和号码类型。根据第三列将信息分类为两个新列的SQL查询

我想要做的是获取我的网站信息,主要联系电话号码和传真号码。到目前为止,我的发言是这样的:

SELECT site.isiteid, 
    site.iclientid, 
    csitecode, 
    csitename, 
    binactive, 
    caddress1, 
    caddress2, 
    ccity, 
    cstateid, 
    czip, 
    icountryid, 
    cattention, 
    cemail, 
    cnumber, 
    cextension 
FROM dbo.site 
    INNER JOIN dbo.address 
     ON dbo.site.isiteid = dbo.address.isiteid 
      AND (site.isiteid = 2) 
    LEFT JOIN dbo.phone 
     ON dbo.site.isiteid = dbo.phone.isiteid 
      AND (dbo.phone.iphtypeid = 1) 

这让我所有的,我需要除传真号码信息(dbo.phone.iphtypeid = 3)。有没有办法给名为[fax]的结果添加另一列,并在site.isiteid = phone.isiteid和phone.iphtypeid = 3时填充它?因此,最后的4列返回将[cemail][cnumber][cextension][cfax].

议决

谢谢所有三个谁回答。所有的答案都是相似的,所以我选择了最详细的解释。我确实需要将表名添加到cnumber引用和cextension中以避免含糊不清。感谢您的回复!

回答

1

是的,你可以通过添加另一个连接到dbo.phone来做到这一点。要区分这两种用法,您需要为第二次加入别名。所以,像这样:

SELECT site.isiteid, 
    site.iclientid, 
    csitecode, 
    csitename, 
    binactive, 
    caddress1, 
    caddress2, 
    ccity, 
    cstateid, 
    czip, 
    icountryid, 
    cattention, 
    cemail, 
    phone.cnumber, 
    phone.cextension, 
    phone_fax.cnumber AS cfax 
FROM dbo.site 
    INNER JOIN dbo.address 
     ON dbo.site.isiteid = dbo.address.isiteid 
      AND (site.isiteid = 2) 
    LEFT JOIN dbo.phone 
     ON dbo.site.isiteid = dbo.phone.isiteid 
      AND (dbo.phone.iphtypeid = 1) 
    LEFT JOIN dbo.phone AS phone_fax 
     ON dbo.site.isiteid = phone_fax.isiteid 
      AND (phone_fax.iphtypeid = 3) 
2

添加另一个JOIN条款

LEFT JOIN dbo.phone f 
ON dbo.site.isiteid = f.isiteid 
AND f.iphtypeid = 3 

这样,你会添加f.cfax到SELECT列表。

给别的表别名也可能很好,所以你可以区分哪些列来自哪个表。

+0

难道你不需要在ON子句中使用'f'别名吗? – Tadmas

+0

别名手机作为F忽略别名...我不知道()也是必要的。 – Zane

+0

@Tadmas修复答案。感谢您指出。 – TTeeple

1

你可以做一些类似的事情,即使我不确定你是如何定义表格的。

SELECT site.isiteid, 
    site.iclientid, 
    csitecode, 
    csitename, 
    binactive, 
    caddress1, 
    caddress2, 
    ccity, 
    cstateid, 
    czip, 
    icountryid, 
    cattention, 
    cemail, 
    cnumber, 
    cextension, 
    CASE WHEN C.iphtypeid = 3 THEN C.cnumber ELSE NULL END [cfax] 
FROM dbo.site A 
    INNER JOIN dbo.address 
     ON dbo.site.isiteid = dbo.address.isiteid 
      AND (site.isiteid = 2) 
    LEFT JOIN dbo.phone C 
     ON A.isiteid = C.isiteid 
+1

我不认为这会奏效。我期望的要求是,在“cnumber”中需要主电话号码(类型1),而“cfax”中需要传真号码。这将最终为每种电话类型返回多行。我只通过一次连接就可以看到你想要做什么 - 我知道如何做到这一点的唯一方法就是进行枢轴转动,这可能有点矫枉过正。 – Tadmas

相关问题