2009-04-22 8 views
0

J'utilise un db MS SQL et j'ai 3 tables: 'base_info', 'messages', 'config'Comparer 2 valeurs de différents types à l'intérieur de la sous-requête

bases: 
ID Name NameNum 
==================================== 
1 Home 101 
2 Castle 102 
3 Car  103 

messages: 
ID Signal RecBy HQ 
============================ 
111 120  Home  1 
111 110  Castle 1 
111 125  Car  1 
222 120  Home  2 
222 125  Castle 2 
222 130  Car  2 
333 100  Home  1 
333 110  Car  2 

config: 
ID SignalRec SignalOut RecBy HQ 
==================================== 
111  60  45  101 1 
111  40  60  102 1 
222  50  60  102 2 
222  30  90  101 2 
333  80  10  103 1 

Ok maintenant j'ai une sous-requête dans lequel je sélectionne le 'SignalRec' et 'SignalOut' de la table de config et le fais correspondre sur la table de messages par ID et Date (non inclus ci-dessus), le problème est que j'en ai besoin pour correspondre où messages.RecBy = config.RecBy mais config.RecBy est une chaîne mais son nom est équivalent dans la table des bases. J'ai donc presque besoin de faire une sous-requête à l'intérieur d'une sous-requête ou d'un type de jointure et de comparer la valeur retournée.
Voici ce que j'ai jusqu'à présent:

(SELECT TOP 1 config.SignalRec from config WHERE config.ID = messages.ID AND ||I need th other comparison here||...Order By...) As cfgSignalRec, 
(SELECT TOP 1 config.SignalOut from config WHERE config.ID = messages.ID AND ||I need th other comparison here||...Order By...) As cfgSignalOut 

J'ai essayé de faire cela aussi clair que possible, mais si vous avez besoin de plus d'info laissez-moi savoir.

+0

Je ne pouvais pas penser à un bon titre pour ça. –

Répondre

0

Je pense que je ne l'ai pas été assez clair ce que je voulais faire, désolé. Les données sont réellement différentes dans les 2 tableaux, bien que les corrélations soient les mêmes. C'est un peu confus d'expliquer sans entrer dans les détails sur le fonctionnement du système.
En fait, j'ai trouvé un moyen très rapide de le faire.
intérieur de mon sous-requête que je fais ceci:

(SELECT TOP 1 config.Signal FROM config,bases 
    WHERE config.ID = messages.ID AND bases.Name = messages.RecBy AND bases.NameNum = 
    config.RecBy Order By...) 

Donc, ce consiste essentiellement à comparer les 2 RecBy de différentes tables, même si l'on est un entier et l'autre est une chaîne. Cela me fait penser à un match et chercher dans Excel.

2

Je voudrais normaliser RecBy dans votre table de messages pour référencer la table de bases. Pourquoi inséreriez-vous le contenu de la chaîne s'il est également référencé dans les bases?

C'est exactement la raison pour laquelle la normalisation existe: réduisez la redondance, réduisez l'ambiguïté et renforcez l'intégrité référentielle. Pour que cela soit plus clair, RecBy dans la table des messages doit être une clé étrangère à Bases.

2

Je pense que cela pourrait faire l'affaire (bien que je ne l'ai pas essayé ...)

SELECT 
    c.SignalRec 
FROM config c 
    INNER JOIN bases b 
     ON c.RecBy = b.NameNum 
    INNER JOIN messages m 
     ON b.Name = m.RecBy 
WHERE c.ID = m.ID 

Cependant, comme Anthony a fait remarquer, vous voulez probablement normaliser les chaînes dans la colonne RecBy dans la messages, car vous avez les mêmes données dans le tableau bases.

+0

Je n'ai pas la persmission à normaliser. Puis-je le faire à l'intérieur d'une sous-requête? –

+0

La requête que j'ai montrée devrait fonctionner sans normalisation. N'est-ce pas? Quelles erreurs/résultats inattendus obtenez-vous? –

0

D'après votre description, il semble tout comme vous avez besoin de deux REJOINT

SELECT TOP 1 
    c.SignalRec 
FROM 
    config c 
INNER JOIN 
    bases b 
ON c.RecBy = b.NameNum 
INNER JOIN 
    messages m 
ON b.Name = m.RecBy 
+0

Est-ce que cela fonctionnera dans une sous-requête? –

+0

Cela fonctionnera-t-il dans une sous-requête? - Oui, il sera –