SQL - 查询多个不同的表(不是UNION)

时间:2016-05-26 15:28:11

标签: sql-server tsql sql-server-2008-r2

语言:T-SQL
服务器:SQL Server 2008 R2 - SQL Server 2014

我有什么,基于在这里搜索其他地方,似乎要么是一个独特的问题,要么我无法正确地表达我想要完成的事情。我想查询具有不同字段结构的多个不相似表,并将它们连接到另一个表。我们有一张ASSETS tb_assets表和一张LICENSES tb_licenses表。我想查询这两个并将它们加入VENDORS tb_vendors表。

像这样:

----------------------                       ---------------------------
|      TB_ASSETS     |                       |    TB_LICENSES          |
----------------------                       ---------------------------
| f_assetvendor      | <~~~             ~~~> | f_licensevendor         |
| f_assettag         |    |             |    | f_licensename           |
| f_assetname        |    |             |    | f_licenseexpirationdate |
|                    |    |             |    | f_licensequantity       |
----------------------    |             |    ---------------------------
                          |             |
                   ~~~~~~~~             ~~~~~~~~~~
                   |    ----------------------   |
                   |    |     TB_VENDORS     |   | 
                   |    ----------------------   | 
                   ~~>  | f_vendorGUID       | <~~
                        | f_vendorname       |
                        ---------------------- 

举一个简短的例子,我想搜索亚马逊的供应商名称(f_vendorname),我想查询tb_assets以及tb_licenses。我在下面尝试的查询错误Invalid column name 'f_assetvendor',所以我做错了。

SELECT 
    f_assetvendor AS 'AssetVendor', f_licensevendor as 'LicenseVendor'
FROM 
    tb_assets, tb_licenses
LEFT JOIN 
    tb_vendors assven ON assven.f_vendorGUID = f_assetvendor
LEFT JOIN 
    tb_vendors licven ON licven.f_vendorGUID = f_licensevendor
WHERE 
    f_vendorname LIKE '%Amazon%'

关于标题为“not UNION”的标题,我不能在这里使用UNION,因为最终结果集的UNION列名取自第一个查询,列必须具有相同的数据类型,并且两个表都必须列数相同。

2 个答案:

答案 0 :(得分:1)

放手一搏;

SELECT
    v.f_vendorGUID, 
    v.f_vendorname,
    a.f_assetvendor AssetVendor,
    l.f_licensevendor LicenseVendor
FROM 
    TB_VENDORS v
JOIN 
    TB_ASSETS a ON v.f_vendorGUID = a.f_assetvendor
JOIN 
    TB_LICENSES l ON v.vendorGUID = l.f_licensevendor
WHERE 
    v.vendorname LIKE '%Amazon%' 

您可以使用TB_VENDORS作为主表,并将其他两个表连接到它,在这个实例中(内部联接),它们应该没有特定的顺序。您已在图中显示这些表之间存在连接表。如果您有可能在TB_ASSETS或TB_LICENCES中丢失数据,请使用LEFT JOIN而不是JOIN。

请放弃你在FROM语句中使用的旧式连接的习惯,这是一种非常古老的方式。

答案 1 :(得分:0)

我知道你对工会声明说不,但我认为除非我误解了你的询问,否则你会得到你需要的东西。

Select  [t].[Vendor]
      , [t].[VendorType]
From    ( Select    [f_assetvendor] As 'Vendor'
                  , 'Asset' As 'VendorType'
          From      [tb_assets]
                    Left Join [tb_vendors] [assven]
                        On [assven].[f_vendorGUID] = [f_assetvendor]
          Union All
          Select    [f_licensevendor] As 'Vendor'
                  , 'License' As 'VendorType'
          From      [tb_licenses]
                    Left Join [tb_vendors] [licven]
                        On [licven].[f_vendorGUID] = [f_licensevendor]
        ) [t]
Where [t].[Vendor] Like '%Amazon%';

但是,你到达那里,你需要使你的桌子足够相似,以便一起报告。