2010-10-19 4 views
1

Cela a peut-être déjà été demandé et je ne le trouve tout simplement pas.SQL Obtient des colonnes spécifiques d'une table et toutes les lignes d'une table jointe dans une requête

J'ai une relation de un à plusieurs dans la base de données sur quelques tables.

  • table1
  • table2
  • table3

table2 - table3 est le 1-plusieurs

est ici une maquette de ce que j'ai:

select 
table1.id 
table1.Column 
table2.Column2 
-- I want all entries here from table 3 here as well 
From table1 t1 
left outer join table2 t2 on t2.ID = t1.ID 
left outer join join table3 t3 on t3.ID2 = t2.ID2 

Est il est possible de sélectionner également tous les e Les noms qui appartiennent à table3 dans cette requête sans spécifier une sous-requête dans l'instruction select?

Aussi, cela vous semble-t-il correct? Comme je l'ai dit dans le passé, je suis vraiment nouveau à SQL, donc mon code sucky ...

EDIT

Désolé les gars, je me suis trompé. J'ai besoin d'une seule colonne de chacune des lignes qui doivent être table3

select 
table1.id, 
table1.Column, 
table2.Column2, 
-- I'm going to need a subquery here aren't I...? 
table3.columnFromRrow1, 
table3.columnFromRrow2, 
table3.columnFromRrow3 
From table1 t1 
left outer join table2 t2 on t2.ID = t1.ID 
left outer join join table3 t3 on t3.ID2 = t2.ID2 
+0

De votre édition il ressemble maintenant Vous avez besoin d'un Pivot. Y a-t-il toujours 3 lignes dans la table 3? Quel RDBMS utilisez-vous? –

+0

SQL Server 2005, je pense qu'il peut y avoir plus de 3 lignes, mais je ne suis pas sûr que cela m'importe. Le client a seulement demandé le top 3. – EJC

+0

Top 3 classés par quoi? –

Répondre

2
;WITH cte AS 
    (SELECT table1.t1id, 
       table1.t1col, 
       table2.t2col, 
       table3.t3col, 
       ROW_NUMBER() OVER (PARTITION BY t1id,t1col,t2col 
           ORDER BY table3.id) AS RN 
    FROM  table1 t1 
       LEFT OUTER JOIN table2 t2 
       ON  t2.ID = t1.ID 
       LEFT OUTER JOIN 
       JOIN table3 t3 
       ON  t3.ID2 = t2.ID2 
    ) 
SELECT 
    t1id, 
    t1col, 
    t2col, 
    MAX(CASE WHEN RN=1 THEN t3col END) AS columnFromRrow1, 
    MAX(CASE WHEN RN=2 THEN t3col END) AS columnFromRrow2, 
    MAX(CASE WHEN RN=3 THEN t3col END) AS columnFromRrow3 
FROM cte 
WHERE RN<=3 
GROUP BY t1id,t1col,t2col 
+0

Génial, c'est exactement ce que je veux. Je vois qu'il a fallu un peu de magie SQL pour le faire. :) – EJC

1

J'ai modifié (et corrigé votre requête pour faire ce que vous voulez).

SELECT 
    table1.id, 
    table1.Column, 
    table2.Column2, 
    table3.* -- All columns from table3 
FROM table1 AS t1 
    LEFT OUTER JOIN table2 AS t2 
     ON t2.ID = t1.ID 
    LEFT OUTER JOIN table3 AS t3 
     ON t3.ID2 = t2.ID2 

NOTE: Cette réponse n'est plus valide, parce que la question initiale a été modifiée ...

-1

Utilisation *

select 
table1.id 
table1.Column 
table2.Column2 
-- I want all entries here from table 3 here as well 
table3.* 
From table1 t1 
left outer join table2 t2 on t2.ID = t1.ID 
left outer join join table3 t3 on t3.ID2 = t2.ID2 
+0

L'utilisation du * dans une requête de production est une pratique de programmation extrêmement médiocre. – HLGEM

Questions connexes