2009-07-07 5 views
0

Quand j'exécute le code suivant, je reçois des résultats tels que:Comment construire correctement la sous-requête SQL dans ce code?

ID column1 column2 

34 NULL NULL 
34 Org13 Org13 
36 NULL NULL 
36 NULL Org2 
36 Org4 NULL 
41 NULL NULL 
41 NULL Org5 
41 Org3 NULL 

Je veux que mes résultats ressemblent:

ID column1 column2 

34 Org13 Org13 
36 Org4 Org2 
41 Org3 Org5 

J'ai deux tables: Table1 et Table2. La table 2 est une table de recherche avec les champs suivants: id, name

Le tableau 1 comporte les champs suivants (id, column1, column2). colonne1 et colonne2 les deux ont des relations clés étrangères à la table de recherche:

FK_1: Table1.column1-Table2.id 
FK_2: Table1.column2-Table2.id 

Comme je veux retirer les valeurs de colonne1 et colonne2, et puisque ces deux valeurs sont sur le même lookups champ (Table2.name) , Je soupçonne que j'ai besoin de faire des sélections intérieures.

Mon code est ci-dessous. Comment puis-je changer cela afin qu'il produise les résultats souhaités, au lieu de ceux que je reçois? Merci d'avance!

DECLARE @value INT 
SET @value = 14 

SELECT DISTINCT 
    Table1.[id]   AS ID 
    , (SELECT DISTINCT 
      Table2.[name] 
     WHERE 
      Table1.column1 = 
      Table2.id) AS column1 
    , (SELECT DISTINCT 
      Table2.[name] 
     WHERE 
      Table1.column2 = 
      Table2.id) AS column2 
FROM 
    Table1 
    ,Table2 
WHERE 
    Table1.[id] = @value 

Répondre

2

GBN, je pense que vous vouliez écrire

DECLARE @value INT 
SET @value = 1 

SELECT --??? DISTINCT 
    t1.[id] AS ID, --- missed comma 
    table2a.name, 
    table2b.name 
FROM 
    Table1 t1 
    JOIN Table2 table2a ON t1.column1 = table2a.id 
    JOIN Table2 table2b ON t1.column2 = table2b.id -- you have t1.column1 oops 
WHERE 
    t1.[id] = @value 
+0

Merci beaucoup! – Cuga

+0

Si column1 et/ou column2 sont nullables, vous pouvez utiliser des jointures à gauche au lieu de jointures internes afin de ne pas perdre de lignes. –

+0

Merci pour le heads-up. Dans ce cas particulier, ils ne sont pas Nullable, mais je garderai votre avis en tête =) – Cuga

2
DECLARE @value INT 
SET @value = 14 

SELECT 
    t1.[id]     AS ID 
    MAX(t2a.name), 
    MAX(t2b.name) 
FROM 
    Table1 t1 
    LEFT JOIN 
    Table2 t2a ON t1.column1 = t2a.id 
    LEFT JOIN 
    Table2 t2b ON t1.column2 = t2b.id 
WHERE 
    t1.[id] = @value 
GROUP BY  
    t1.[id]  
3
/* 
    create table table1(id int, col1 int, col2 int); 
    create table table2(id int, name varchar(10)); 

    insert into table2 values(1, 'org 1'); 
    insert into table2 values(2, 'org 2'); 
    insert into table2 values(3, 'org 3'); 
    insert into table2 values(4, 'org 4'); 

    insert into table1 values(1, 1, 2); 
    insert into table1 values(2, 2, 2); 
    insert into table1 values(3, 2, 3); 
    insert into table1 values(4, 4, 1); 
    */ 

    select 
     a.id, 
     b.name as column1, 
     c.name as column2 
    from 
     table1 a 
    join table2 b on b.id = a.col1 
    join table2 c on c.id = a.col2; 


id  column1  column2  
----- ---------- ---------- 
1  org 1  org 2  
2  org 2  org 2  
3  org 2  org 3  
4  org 4  org 1  

4 record(s) selected [Fetch MetaData: 3/ms] [Fetch Data: 0/ms] 

[Executed: 7/7/09 4:07:25 PM EDT ] [Execution: 1/ms] 
+0

ce que sur les valeurs nulles et plusieurs valeurs d'identité dans le tableau 1? – gbn

+0

Parce qu'il l'appelait ses "résultats", je n'ai pas interprété la première sortie montrée dans sa question comme le contenu de la table1. J'ai supposé que les nulls provenaient de sa jointure complète incorrecte dans son exemple de requête. Est-ce incorrect? – Daryl

+0

Vous avez raison dans votre interprétation - les null étaient une partie de ma jointure défectueuse - il n'y a pas de null dans les enregistrements. – Cuga

Questions connexes