2009-07-17 8 views
1

Tableau 1
...
LogEntryID *PrimaryKey*
Valeur
ThresholdID - - - Lien vers le seuil approprié étant appliqué à cette entrée de journal.
...Comment écrire une requête SQL avec une condition impliquant une deuxième table?

Tableau2
...
ThresholdID *PrimaryKey*
Seuil
...

Tous les champs sont des nombres entiers.
Les trucs "..." sont là pour montrer que ces tables contiennent beaucoup plus d'imformations que cela. Ils sont mis en place de cette façon pour une raison, et je ne peux pas le changer à ce stade.

J'ai besoin d'écrire une instruction SQL pour sélectionner tous les enregistrements de Tableau 1 où le champ de valeur dans ce particulier enregistrement du journal est inférieur au champ Seuil dans l'enregistrement lié de Tableau2. Je suis nouveau à SQL, donc je sais que c'est une question de base.
Si quelqu'un peut me montrer comment cette instruction SQL serait structurée, ce serait grandement apprécié.

+0

Heres un bon tutoriel SQL http://www.w3schools.com/SQl/default.asp –

Répondre

4
SELECT T1.* 
    FROM Table1 T1 
    JOIN Table2 T2 ON T2.ThresholdID = T1.ThresholdID 
WHERE T2.Threshold > T1.Value 
+0

En outre, il convient de noter que vous pouvez faire "JOIN Table2 T2 sur T2.ThresholdID = T1.ThresholdID ET T2.Threshold> T1.Value" qui provoquera la jointure à seulement se produire sur les lignes qui répondent à vos conditions de filtre, au lieu de rejoindre toutes les lignes correspondantes, puis de filtrer dans le WHERE. – cfeduke

+0

Il serait intéressant de comparer les plans d'exécution. – n8wrl

+0

@Both. Probablement donnerait le même plan. Je dirais que la construction WHERE est plus claire parce que c'est un filtre après le JOINid. – gbn

1
SELECT * FROM Table1 
JOIN Table2 
ON table1.ThresholdID = table2.ThresholdID --(assuming table 2 holds the same value to link them together) 
WHERE 
value < thresholdvalue 

A 'JOIN relie 2 tables à base de la clause 'ON'(qui peut être multipart, en utilisant 'ET' et 'OU')

Si vous avez 3 entrées dans le tableau 2, qui partagent La clé primaire de table1 (une association un-à-plusieurs) vous recevrez 3 lignes dans votre jeu de résultats.

pour les tableaux ci-dessous, par exemple:

Table 1: 
Key  Value 
1  Hi 
2  Bye 

Table 2: 
Table1Key 2nd_word 
1   You 
1   fellow 
1   friend 
2   now 

cette requête:

SELECT * FROM Table1 INSCRIPTION Tableau2 sur table1.key = table2.table1key

obtient ce jeu de résultats :

Key Value Table1Key 2nd_word 
1  Hi  1   You 
1  Hi  1   fellow 
1  Hi  1   friend 
2  Bye  2   now 

N Notez que JOIN ne retournera les résultats que s'il y a une correspondance dans la deuxième table, il ne retournera pas de résultat s'il n'y a pas de correspondance. Vous pouvez LEFT JOIN pour cela (tous les champs de la seconde table seront NULL).

Les JOINs peuvent également être reliés ensemble, le résultat du précédent JOIN est utilisé à la place de la table d'origine.

+0

Où avez-vous l'JOIN sur logentryid de? Et la clause where sur "valeur seuil"? – gbn

+0

Une ligne SQL hâtive que j'ai dactylographiée le plus rapidement possible pour que je puisse ensuite mieux répondre: une discussion sur les JOINs ... que je pensais beaucoup plus utile que de simplement lui donner un poisson. – Jeff

+0

hâte d'obtenir la première réponse? ;-) – gbn

1
SELECT t1.* 
FROM dbo.Table1 t1 INNER JOIN dbo.Table2 t2 ON t1.ThresholdID = t2.ThresholdID 
WHERE t2.Threshold > t1.Value 
1

SELECT * de table1 t1 t2 rejoindre table2 sur (t1.thresholdId = t2.thresholdId) où t1.value t2 <.seuil;

1
SELECT t1.LogEntryID, t1.Value, t1.ThresholdID 
FROM Table1 t1 
INNER JOIN Table2 t2 ON t1.ThresholdID = t2.ThresholdID 
WHERE t1.Value < t2.threshold 
Questions connexes