2009-11-30 75 views
1

MS SQL Serverstored procedure是:如何使用內部聯接選擇沒有重複的行?

set ANSI_NULLS ON 
set QUOTED_IDENTIFIER ON 
GO 
ALTER PROCEDURE [dbo].[sp_close] 
@DATE NVARCHAR(8) 
AS 
BEGIN 
SELECT appointment_datas.appointment_date 
     ,appointment_datas.appointment_no 
     ,costumer_datas.costumer_name 
     ,appointment_datas.appointment_type 
     ,personel_datas.personel_ADI 
FROM [LONI].[dbo].appointment_datas 
     INNER JOIN [LONI].[dbo].costumer_datas ON appointment_datas.appointment_costumer = costumer_datas.costumer_id 
     INNER JOIN [LONI].[dbo].personel_datas ON appointment_datas.appointment_personel = personel_datas.personel_id 
     INNER JOIN [GUONU].[dbo].dayend ON appointment_datas.appointment_no <> dayend.appointment_no COLLATE Turkish_CI_AS 
WHERE CONVERT(nvarchar(8),appointment_datas.appointment_date,112) = @DATE 
END 

有了這個代碼,我選擇相同的記錄重複行。實際上,我想從[LONI]。[dbo] .appointment_datas中選擇字段,但如果appointment_no 不在[GUONU]。[dbo] .dayend

+0

請使用空格來縮進代碼,使其代碼塊。 – 2009-11-30 20:22:58

+1

看起來這是社區模式與大家重新格式化:O – Andomar 2009-11-30 20:27:58

+0

@Andomar:必須是一個10K的東西?我無法將問題更改爲社區維基... – 2009-11-30 20:32:31

回答

1

如果我正確理解你的問題(在您編輯後)

但如果appointment_no不在 [GUONU [DBO]。dayend

,你真正想要一個NOT EXISTS子查詢:

set ANSI_NULLS ON 
set QUOTED_IDENTIFIER ON 
GO 
ALTER PROCEDURE [dbo].[sp_close] 
@DATE NVARCHAR(8) 
AS 
BEGIN 
SELECT appointment_datas.appointment_date 
     ,appointment_datas.appointment_no 
     ,costumer_datas.costumer_name 
     ,appointment_datas.appointment_type 
     ,personel_datas.personel_ADI 
FROM [LONI].[dbo].appointment_datas 
     INNER JOIN [LONI].[dbo].costumer_datas ON appointment_datas.appointment_costumer = costumer_datas.costumer_id 
     INNER JOIN [LONI].[dbo].personel_datas ON appointment_datas.appointment_personel = personel_datas.personel_id 
WHERE CONVERT(nvarchar(8),appointment_datas.appointment_date,112) = @DATE 
    AND NOT EXISTS (SELECT 'X' FROM [GUONU].[dbo].dayend WHERE dayend.appointment_no = appointment_datas.appointment_no)  
END 
+0

是的,你沒有理解正確。非常感謝你的幫助。 – Kerberos 2009-11-30 22:45:54

4

SELECT DISTINCT將刪除輸出中的重複項。

但是你的SQL看起來不對。你確定你的意思是寫:

TABLE1.FIELD1 <> TABLE1.FIELD1 

這總是蒸發爲假。我認爲你的SQL可能有錯誤,這可能是你獲取重複值的原因。在聯接子句中,您應該很少使用<>,並且您不應該在雙方都有相同的字段。

也許你打算:

ON [DB1].[dbo].TABLE1.FIELD1 <> [DB2].[dbo].TABLE1.FIELD1 

但這將產生不匹配的所有行的笛卡爾積。我懷疑這是你的真正意思。也許你想這樣:

ON [DB1].[dbo].TABLE1.ID = [DB2].[dbo].TABLE1.ID 
WHERE[DB1].[dbo].TABLE1.FIELD1 <> [DB2].[dbo].TABLE1.FIELD1 

這匹配來自每個數據庫具有相同的ID,但在某一列不同的行。請注意,<>不在JOIN子句中。

--- UPDATE ---

也許你的意思是選擇從兩個不同的數據庫結果,然後他們工會?

SELECT appointment_datas.appointment_date 
     ,appointment_datas.appointment_no 
     ,costumer_datas.costumer_name 
     ,appointment_datas.appointment_type 
     ,personel_datas.personel_ADI 
FROM [LONI].[dbo].appointment_datas 
     INNER JOIN [LONI].[dbo].costumer_datas ON appointment_datas.appointment_costumer = costumer_datas.costumer_id 
     INNER JOIN [LONI].[dbo].personel_datas ON appointment_datas.appointment_personel = personel_datas.personel_id 
WHERE CONVERT(nvarchar(8),appointment_datas.appointment_date,112) 

UNION 

SELECT appointment_datas.appointment_date 
     ,appointment_datas.appointment_no 
     ,costumer_datas.costumer_name 
     ,appointment_datas.appointment_type 
     ,personel_datas.personel_ADI 
FROM [GUONU].[dbo].appointment_datas 
     INNER JOIN [GUONU].[dbo].costumer_datas ON appointment_datas.appointment_costumer = costumer_datas.costumer_id 
     INNER JOIN [GUONU].[dbo].personel_datas ON appointment_datas.appointment_personel = personel_datas.personel_id 
WHERE CONVERT(nvarchar(8),appointment_datas.appointment_date,112) 

--- SOLUTION ---

使用NOT EXISTS的WHERE子句。閱讀評論,看看爲什麼。

+0

我有2個不同的數據庫。這意味着在DB1和Table1中的table1 ind DB2 – Kerberos 2009-11-30 20:36:06

+0

我已經用我最好的猜測更新了我的評論,以瞭解您做錯了什麼。如果這個猜測不正確,也許你可以用更多的信息更新你的問題,並解釋你正在嘗試做什麼。使用真正的列名也是有用的,而不是value1,value2等。 – 2009-11-30 20:45:02

+0

我用真實的柱名更新我的代碼。問題是基於這條線; INNER JOIN [ARISTON_GUN_SONU]。[dbo] .KAPANIS_RANDEVU ON RANDEVU_BILGILERI.RAN_NO <> KAPANIS_RANDEVU.RAN_NO COLLATE Turkish_CI_AS 此sp位於GUONU數據庫 – Kerberos 2009-11-30 21:04:22

2

INNER JOIN [DB2].[dbo].TABLE1 ON TABLE1.FIELD1 <> TABLE1.FIELD1 

是沒有意義的,你想換一種說法......

+0

用這條線我想在2個不同的dbs之間選擇獨特的行。 – Kerberos 2009-11-30 20:39:02

+0

然後你不想加入。您希望從兩個單獨查詢中的每個數據集中選擇行,然後使用UNION將這些查詢合併到一個結果集中。 – 2009-11-30 20:48:32

+0

我從來沒有使用UNION之前。我需要學習如何使用它。謝謝。同時我更新了我的代碼。 – Kerberos 2009-11-30 21:29:00

0

SELECT DISTINCT TABLE1.FIELD1 ,TABLE2.FIELD1 ,TABLE1.FIELD3 ,TABLE3.FIELD1 FROM ...

注意:在某些變體中,您必須將字段列表括起來,即
SELECT DISTINCT(TABLE1.FIELD1 ,TABLE2.FIELD1 ,TABLE1.FIELD3 ,TABLE3.FIELD1)FROM ...