2016-05-26 62 views
0

語言:T-SQL
服務器:SQL Server 2008 R2中 - SQL服務器2014SQL - 查詢多個異種表(未UNION)

我有一個基於搜索這裏的其他地方是什麼,似乎要麼是一個獨特的問題,要麼我不能正確地描述我想要完成的事情。我想查詢多個不相似的具有不同字段結構的表,並將它們連接到單個其他表。我們有一個資產登記表tb_assets和一個許可證表tb_licenses。我想通過這兩個查詢並將它們連接到供應商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%' 

關於我的標題,指出「不聯盟」,我不能在這裏使用UNION,因爲與最終的結果集UNION列名第一個查詢取,列必須具有相同的數據類型,並且這兩個表必須具有相同的列數。

+2

[不良習慣踢:使用舊式JOIN](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style- joins.aspx) - 在ANSI - ** 92 ** SQL標準中**舊式*逗號分隔的表*樣式列表已替換爲* proper * ANSI'JOIN'語法(**超過20年**之前),其使用是不鼓勵的。你應該**絕對不是**混合兩種風格!堅持正確的ANSI JOIN - 永遠。 –

+0

@marc_s,我不能將頂部兩個表加在一起,因爲它們沒有要彼此加入的列。 – Beems

+2

@Beems你可以使用CROSS JOIN – JamieD77

回答

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語句中使用的舊式連接的習慣,這是一種非常古老的做法。

+0

對不起@Rich,我以前是錯的。這是加入資產和許可證表格的結果,這是我需要避免的。例如,如果我有一個許可證和一個與Amazon的供應商匹配的資產,它將返回一行並加入這些行。如果我有兩個資產和一個許可證,我會得到兩行。 – Beems

+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%'; 

但是,如果您到達那裏,您需要使表格足夠類似,以便一起報告。