2011-04-25 57 views
1

我從多個表創建視圖。每個包含的表都有一個名爲Contact_ID的列。我正在使用MS SQL 2005.我看到我可以使用DISTINCT通過Contact_ID返回唯一集合,但是我的視圖僅顯示Contact_ID。返回具有「DISTINCT」和多個其他選定列的唯一集合

我需要視圖來包含不僅僅是Contact_ID所以我需要創建一個SELECT語句與所有正確的列,但我不能有重複的記錄。

這是我目前有:(這將返回我需要的所有數據,但包含CONTACT_ID的重複記錄)

SELECT dbo.[1_MAIN - Contacts].Contact_ID, dbo.[1_MAIN - Contacts].Date_entered_into_Database, dbo.[1_MAIN - Contacts].Date_of_Initial_Contact, 
     dbo.[1_MAIN - Contacts].[Company_ Name], dbo.[1_MAIN - Contacts].Key_Contact_Title, dbo.[1_MAIN - Contacts].Key_Contact_First_Name, 
     dbo.[1_MAIN - Contacts].Key_Contact_Middle, dbo.[1_MAIN - Contacts].Key_Contact_Last_Name, dbo.[1_MAIN - Contacts].Key_Credential, 
     dbo.[1_MAIN - Contacts].Key_Contact_Occupation, dbo.[1_MAIN - Contacts].Key_Degree_1, dbo.[1_MAIN - Contacts].Key_Degree_2, 
     dbo.[1_MAIN - Contacts].Key_Degree_3, dbo.[1_MAIN - Contacts].Date_of_Highest_Degree, dbo.[1_MAIN - Contacts].Work_Setting, 
     dbo.[1_MAIN - Contacts].Website_Address, dbo.[1_MAIN - Contacts].Email_1_Key_Contact, dbo.[1_MAIN - Contacts].Email_2, 
     dbo.[1_MAIN - Contacts].Email_3, dbo.[1_MAIN - Contacts].Day_Time_Phone_Number, dbo.[1_MAIN - Contacts].Extension, 
     dbo.[1_MAIN - Contacts].Mobile_Phone_Number, dbo.[1_MAIN - Contacts].Bus_Fax_Number, dbo.[1_MAIN - Contacts].Home_Phone_Number, 
     dbo.[1_MAIN - Contacts].Home_Fax_Number, dbo.[1_MAIN - Contacts].Mailing_Street_1, dbo.[1_MAIN - Contacts].Mailing_Street_2, 
     dbo.[1_MAIN - Contacts].Mailing_City, dbo.[1_MAIN - Contacts].Mailing_State, dbo.[1_MAIN - Contacts].[Mailing_Zip/Postal], 
     dbo.[1_MAIN - Contacts].Mailing_Country, dbo.[1_MAIN - Contacts].[Bad_Address?], dbo.[1_MAIN - Contacts].[PROV/REG?], 
     dbo.[1_MAIN - Contacts].status_flag, dbo.[1_MAIN - Contacts].status_flag AS status_flag2, dbo.Providers.Contact_ID AS Expr1, 
     dbo.Providers.Referral_Source, dbo.Resource_Center.access, dbo.Referral.Contact_Source, dbo.Resource_Center.cert_start_date, 
     dbo.Resource_Center.cert_exp_date, dbo.prov_training_records.Contact_ID AS Expr2, dbo.prov_training_records.date_reg_email_sent 
FROM dbo.[1_MAIN - Contacts] INNER JOIN 
     dbo.Referral ON dbo.[1_MAIN - Contacts].Contact_ID = dbo.Referral.Referral_ID INNER JOIN 
     dbo.prov_training_records ON dbo.[1_MAIN - Contacts].Contact_ID = dbo.prov_training_records.Contact_ID LEFT OUTER JOIN 
     dbo.Resource_Center ON dbo.[1_MAIN - Contacts].Contact_ID = dbo.Resource_Center.Contact_ID FULL OUTER JOIN 
     dbo.Providers ON dbo.[1_MAIN - Contacts].Contact_ID = dbo.Providers.Contact_ID 

與表名稱相同的查詢別名:

SELECT c.Contact_ID, c.Date_entered_into_Database, c.Date_of_Initial_Contact, 
     c.[Company_ Name], c.Key_Contact_Title, c.Key_Contact_First_Name, 
     c.Key_Contact_Middle, c.Key_Contact_Last_Name, c.Key_Credential, 
     c.Key_Contact_Occupation, c.Key_Degree_1, c.Key_Degree_2, 
     c.Key_Degree_3, c.Date_of_Highest_Degree, c.Work_Setting, 
     c.Website_Address, c.Email_1_Key_Contact, c.Email_2, 
     c.Email_3, c.Day_Time_Phone_Number, c.Extension, 
     c.Mobile_Phone_Number, c.Bus_Fax_Number, c.Home_Phone_Number, 
     c.Home_Fax_Number, c.Mailing_Street_1, c.Mailing_Street_2, 
     c.Mailing_City, c.Mailing_State, c.[Mailing_Zip/Postal], 
     c.Mailing_Country, c.[Bad_Address?], c.[PROV/REG?], 
     c.status_flag, c.status_flag AS status_flag2, p.Contact_ID AS Expr1, 
     p.Referral_Source, rc.access, r.Contact_Source, rc.cert_start_date, 
     rc.cert_exp_date, tr.Contact_ID AS Expr2, tr.date_reg_email_sent 
FROM dbo.[1_MAIN - Contacts] c INNER JOIN 
     dbo.Referral r ON c.Contact_ID = r.Referral_ID INNER JOIN 
     dbo.prov_training_records tr ON c.Contact_ID = tr.Contact_ID LEFT OUTER JOIN 
     dbo.Resource_Center rc ON c.Contact_ID = rc.Contact_ID FULL OUTER JOIN 
     dbo.Providers p ON c.Contact_ID = p.Contact_ID 

回答

2
WITH q AS 
     (
     SELECT *, 
       ROW_NUMBER() OVER (PARTITION BY dbo.[1_MAIN - Contacts].Contact_ID ORDER BY dbo.[1_MAIN - Contacts].Contact_ID) AS rn 
     FROM dbo.[1_MAIN - Contacts] 
     INNER JOIN 
       dbo.Referral 
     ON  dbo.[1_MAIN - Contacts].Contact_ID = dbo.Referral.Referral_ID 
     INNER JOIN 
       dbo.prov_training_records 
     ON  dbo.[1_MAIN - Contacts].Contact_ID = dbo.prov_training_records.Contact_ID 
     LEFT OUTER JOIN 
       dbo.Resource_Center 
     ON  dbo.[1_MAIN - Contacts].Contact_ID = dbo.Resource_Center.Contact_ID 
     FULL OUTER JOIN 
       dbo.Providers 
     ON  dbo.[1_MAIN - Contacts].Contact_ID = dbo.Providers.Contact_ID 
     ) 
SELECT * 
FROM q 
WHERE rn = 1 
+0

我收到錯誤:「OVER SQL構造或語句不受支持。」 – UpHelix 2011-04-25 16:05:13

+0

@Dale:這個查詢返回什麼結果:'從sys.databases中選擇compatibility_level,其中name = db_name()'? – Quassnoi 2011-04-25 16:09:02

+0

它返回「90」 – UpHelix 2011-04-25 16:10:50

1

最初誤讀這個問題,你需要將所有的數據分組,但是如果你想顯示所有的數據,並且有獨特的,你需要在某些情況下使用最小或最大,如果有人有兩部手機...你想要顯示什麼?

+0

準確地說,如果一條記錄在「Contact_Source」列中有一個值,我希望將該記錄用於NULL。 – UpHelix 2011-04-25 16:06:58

+1

這種情況下使用GROUP by和MAX – SQLMenace 2011-04-25 16:08:06

+0

嗯,似乎無法得到這個權利。我如何在我的例子中使用GROUP BY和MAX? – UpHelix 2011-04-25 19:24:51

相關問題