2009-11-30 6 views
1

Mon MS SQL Serverstored procedure est:Comment puis-je sélectionner aucune ligne dupliquée avec jointure interne?

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 

Avec ce code, je sélectionne les lignes en double les mêmes enregistrements. En fait, je veux sélectionner des champs de [LONI]. [Dbo] .appointment_datas mais si appointment_no est pas [GUONU]. [Dbo] .dayend

+0

S'il vous plaît utiliser des espaces pour indenter votre code pour en faire un bloc de code. –

+1

Apparemment, cela est allé en mode communautaire avec tout le monde le reformater: O – Andomar

+0

@Andomar: Doit être une chose 10k? Je ne peux pas changer les questions à la communauté wiki ... –

Répondre

1

Si je comprends bien votre question (après votre édition)

mais si appointment_no est pas [GUONU ]. [dbo].dayend

, vous voulez en fait un sous-requête 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

oui vous avez bien compris. merci beaucoup pour votre aide aussi. – Kerberos

4

SELECT DISTINCT supprime les doublons dans votre sortie.

Mais votre SQL semble faux. Etes-vous sûr de vouloir écrire:

TABLE1.FIELD1 <> TABLE1.FIELD1 

Ceci est toujours fausse. Je pense que vous pouvez avoir une erreur dans votre SQL, et c'est peut-être pourquoi vous obtenez des valeurs en double. Vous devriez rarement utiliser <> dans une clause de jointure, et vous ne devriez pas avoir le même champ des deux côtés.

Peut-être que vous aviez l'intention:

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

mais cela va générer un produit cartésien de toutes les lignes qui ne correspondent pas. Je doute que ce soit ce que tu veux vraiment dire. Peut-être que vous voulez ceci:

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

Ce correspondant aux lignes de chaque base de données qui ont la même identité, mais diffèrent dans une certaine colonne. Notez que le <> n'est pas dans la clause JOIN.

--- MISE À JOUR ---

Peut-être vous dire pour sélectionner les résultats des deux bases de données différentes et les syndicats?

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

Utilisez NOT EXISTS dans la clause WHERE. Lisez les commentaires pour voir pourquoi.

+0

J'ai 2 bases de données différentes. Cela signifie que table1 dans DB1 et Table1 ind DB2 – Kerberos

+0

J'ai mis à jour mon commentaire avec ma meilleure estimation de ce que vous faites mal. Si cette supposition est incorrecte, vous pourriez peut-être mettre à jour votre question avec plus d'informations et expliquer ce que vous essayez de faire. L'utilisation des vrais noms de colonnes serait également utile, au lieu de value1, value2, etc. –

+0

Je mets à jour mon code avec un vrai nom de colonne. le problème est basé sur cette ligne; INNER JOIN [ARISTON_GUN_SONU]. [Dbo] .KAPANIS_RANDEVU ON RANDEVU_BILGILERI.RAN_NO <> KAPANIS_RANDEVU.RAN_NO COLLATE Turkish_CI_AS et ce sp est sur la base de données GUONU – Kerberos

2

La ligne

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

n'a pas de sens, vous voulez que ... reformulez

+0

avec cette ligne je veux sélectionner des lignes uniques entre 2 dbs différents. – Kerberos

+0

Ensuite, vous ne voulez pas de jointure. Vous souhaitez sélectionner les lignes de chaque base de données dans deux requêtes distinctes, puis utiliser UNION pour combiner ces requêtes en un ensemble de résultats. –

+0

Je n'ai jamais utilisé UNION auparavant. j'ai besoin d'apprendre à l'utiliser. Je vous remercie. Pendant ce temps, j'ai mis à jour mes codes. – Kerberos

0

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

NB dans certaines variantes, vous devrez mettre entre crochets la liste des champs, c.-à-d.
SELECT DISTINCT (TABLE1.FIELD1 , TABLE2.FIELD1 , TABLE1.FIELD3 , TABLE3.FIELD1) DE ...

Questions connexes