2009-08-04 9 views
0

ok donc ce que je suis en train de réaliser est d'avoir deux instructions SELECT, puis joindre les résultats de chaque j'ai donc quelque chose comme çateaser déclaration Sql

SELECT table.ID, tst.Value 
FROM blah AS table JOIN results AS tst ON tst.RUNID = table.RUNID 
WHERE table.RUNID IN 
(
    ...// nothing important but in the end i get my tst.Value 
) 

deuxième déclaration est presque identique

SELECT table.ID, tst2.Value 
FROM blah AS table JOIN results AS tst2 ON tst2.RUNID = table.RUNID 
WHERE table.RUNID IN 
(
    ...// nothing important but in the end i get my tst2.Value differently 
) 

J'ai besoin de combiner ces deux résultats au format de

SELECT table.ID, tst.Value, tst2.Value 
...... // Somehow using those two statements 

donc, toute personne parlant couramment SQL lang Qui pourrait me dire comment faire cela ou quelles déclarations dois-je utiliser ... Joignez le son comme un bon endroit pour commencer, mais ils utilisent des tables. Je suppose que je pourrais utiliser un tableau de SELECT CREER et rejoindre, mais comme je l'ai dit que je ne suis pas couramment dans SQL si se demander si c'est une bonne idée ou il y a une meilleure idée ...

Merci :)

+0

L'une ou l'autre des valeurs doit-elle être nulle lorsque l'ID n'existe pas dans le tableau respectif ou doit-on supprimer ce résultat? –

+0

ils doivent coexister par la conception de la table – grobartn

Répondre

3

La méthode la plus simple (de ce que vous avez décrit) serait pour déplacer la clause IN dans votre condition de jointure et le faire en une seule requête. Comme ceci:

select 
    table.ID, 
    tst.Value as Value1, 
    txt2.Value as Value2 

from blah table 

left join results tst on tst.RUNID = table.RUNID and tst.RUNID in (...first conditions...) 
left join results tst2 on tst.RUNID = table.RUNID and tst2.RUNID in (...second conditions...) 

Cette structure est un peu absurde de moi (puisque vous filtrer les valeurs de votre table de racine différente à chaque fois). Pourriez-vous afficher la structure réelle et SQL pour nous de regarder? Cela peut le rendre plus clair.

+0

Mon problème avec ceci est le même que mon problème avec la réponse de Tom.De cette manière, joindre de manière efficace 'tst' et' tst2' par leur 'RUNID', que je suppose être nécessairement différent (peut-être se chevaucher, mais différent) basé sur la structure des deux requêtes originales de l'OP. Les jointures à gauche sont un bon moyen de gérer cela, mais il se peut que les enregistrements doivent être joints sur 'table.ID' plutôt que sur 'RUNID'. C'est à l'OP de décider, cependant, donc pas de downvote ou upvote de moi. – Welbog

+0

Je ne peux pas montrer le code réel ... mais la conception de la base de données me force à le faire de cette façon. merci! – grobartn

+0

@Welbog: La syntaxe ici a été prise à partir de la publication de l'OP. Voilà comment ils ont été rejoints. Je ne sais pas pourquoi vous croiriez qu'ils doivent être joints à la pièce d'identité sans avoir aucune information sur le schéma de l'affiche au-delà de ce qui était indiqué. –

0

Cela devrait travailler pour vous:

SELECT table.ID, tst.Value, tst2.Value 
FROM blah AS table 
Inner JOIN results AS tst ON tst.RUNID = table.RUNID 
Inner JOIN results AS tst2 ON tst2.RUNID = table.RUNID 
WHERE table.RUNID IN 
( 
    ...// nothing important but in the end i get my tst2.Value differently 
) 
0

Il est possible d'utiliser plusieurs JOIN dans une requête. Cela devrait résoudre votre question.

1

L'approche naïve, en supposant table.ID est ce qui concerne les deux value domaines:

SELECT first_subquery.ID, first_subquery.Value, second_subquery.Value 
FROM (
    SELECT table.ID, tst.Value 
    FROM blah AS table JOIN results AS tst ON tst.RUNID = table.RUNID 
    WHERE table.RUNID IN 
    (
    ...// nothing important but in the end i get my tst.Value 
) 
) first_subquery 
INNER JOIN (
    SELECT table.ID, tst2.Value 
    FROM blah AS table JOIN results AS tst2 ON tst2.RUNID = table.RUNID 
    WHERE table.RUNID IN 
    (
    ...// nothing important but in the end i get my tst2.Value differently 
) 
) second_subquery 
ON first_subquery.ID = second_subquery.ID 

Cette requête est basée sur les deux vôtres, reliés entre eux.

+0

Si quelqu'un peut expliquer pourquoi cela ne fonctionne pas, je vais enlever mon upvote ... –

+0

+1, devrait fonctionner très bien, presque le même que le mien –

0

essayer quelque chose comme:

SELECT table.ID, tst.Value, dt.Value 
    FROM blah AS table 
     JOIN results AS tst ON tst.RUNID = table.RUNID 
     left outer join (
         SELECT table.ID, tst2.Value 
          FROM blah AS table 
           JOIN results AS tst2 ON tst2.RUNID = table.RUNID 
          WHERE table.RUNID IN( ...// nothing important but in the end i get my tst2.Value differently) 
         ) dt ON table.id=dt.ID 
    WHERE table.RUNID IN( ...// nothing important but in the end i get my tst.Value ) 
+0

wow, 4 les gens descendent les votes à peu près en même temps, sans raisons énumérées ??? –

+1

@KM - C'est apparemment une question dangereuse à répondre. Je pense à la suppression de ma réponse avant que j'obtienne un downvote drive-by. –

+0

+1. Bien que naïve, cette approche est à peu près la même que ma réponse. Ce ne serait pas très sportif de ma part de ne pas remettre en question les gens qui pensent de la même manière que moi. – Welbog

-1

Try this ...

SELECT T1.ID, R1.Value, 
     T2.RunId, R2.Value 
FROM (blah AS T1 JOIN results AS R1 
     ON R1.RUNID = table.RUNID 
      And T1.RUNID IN (/... /)) 
    Cross Join (blah AS T2 JOIN results AS R2 
     ON R.RUNID = T2.RUNID 
      And T2.RunId In (/... /)) 
-1

Essayez ceci:

select a.ID, a.Value, b.Value from 
(
    SELECT table.ID, tst.Value 
    FROM blah AS table JOIN results AS tst ON tst.RUNID = table.RUNID 
    WHERE table.RUNID IN 
    (
    ...// nothing important but in the end i get my tst.Value 
) 
) a, 
(
    SELECT table.ID, tst2.Value 
    FROM blah AS table JOIN results AS tst2 ON tst2.RUNID = table.RUNID 
    WHERE table.RUNID IN 
    (
    ...// nothing important but in the end i get my tst2.Value differently 
) 
) b