2 votes

Combinaison des résultats dans la deuxième table lors de la jointure de deux tables

J'ai ces deux tables que je ne peux pas modifier, et j'essaie d'interroger et de combiner des données provenant de ces deux tables. Ce que j'aimerais idéalement faire, c'est combiner les lignes omises où FieldTime2 est 0, lorsqu'il y a plus de deux résultats pour le même FieldID. Si FieldTime2 est égal à 0 et qu'il n'y a qu'un seul résultat, je veux que la ligne soit affichée.

Pourriez-vous éventuellement compter les FieldID dans Table2 et attribuer un numéro si le compte est supérieur à 1, ou quelque chose comme ça ?

Tableau 1

ID  FieldID  FieldTime
------------------------
 1   A        10
 2   B        15
 3   C        20

Tableau 2

 ID  FieldID  FieldTime2
------------------------
 1   A        0
 2   A        15
 3   B        0
 4   C        10

Sortie souhaitée :

FieldID  FieldTime  FieldTime2
------------------------------
  A      10         15
  B      15         0
  C      20         10

Ma production :

FieldID  FieldTime  FieldTime2
------------------------------
      A      10         0
      A      10         15
      B      15         0
      C      20         10

CODE :

SELECT
    m.FieldID, 
    m.FieldTime,
    n.FieldTime2,

from Table1 m
   Join Table2 n
       ON m.FieldID = n.FieldID

Where n.FieldTime > 0

0voto

cha Points 9518

La solution la plus simple qui me vient à l'esprit est d'utiliser une requête LEFT JOIN, comme ceci :

SELECT
    m.FieldID, 
    m.FieldTime,
    COALESCE(n.FieldTime2, 0) as FieldTime2,

from Table1 m
  left Join Table2 n
       ON m.FieldID = n.FieldID and n.FieldTime2 > 0

Where n.FieldTime > 0

s'il y a plusieurs enregistrements non nuls dans le tableau 2 et qu'un seul est souhaité, la requête sera un peu complexe :

with n as (
select *,
ROW_NUMBER() OVER(PARTITION BY FieldID ORDER BY FieldTime2 DESC) rn
from Table2
)
SELECT
    m.FieldID, 
    m.FieldTime,
    COALESCE(n.FieldTime2, 0) as FieldTime2,

from Table1 m
  LEFT Join n
       ON m.FieldID = n.FieldID and n.rn = 1

Where n.FieldTime > 0

0voto

JanR Points 4961

Sur la base de votre échantillon de données et de l'hypothèse qu'il n'y aura que 1 FieldTime avec un value > 0 vous pouvez simplement utiliser MAX() pour résoudre votre problème :

SELECT
    m.FieldID, 
    m.FieldTime,
    MAX(n.FieldTime2),
FROM Table1 m
JOIN Table2 n ON m.FieldID = n.FieldID
WHERE n.FieldTime > 0
GROUP BY m.FieldID, m.FieldTime

Bien entendu, cette solution ne donnera pas un résultat correct s'il y a plusieurs FieldTime les enregistrements qui ont un value > 0 Dans ce cas, vous pouvez résoudre votre problème en utilisant un UNION :

--cases with one record:
SELECT
    m.FieldID, 
    m.FieldTime,
    n.FieldTime2
FROM Table1 m
JOIN Table2 n ON m.FieldID = n.FieldID
Where m.FieldID in
(
   SELECT FieldID 
   FROM Table2
   HAVING COUNT(FieldID) = 1 -- only one record exists
)
UNION 
--cases with multiple records
SELECT
    m.FieldID, 
    m.FieldTime,
    n.FieldTime2
FROM Table1 m
JOIN Table2 n ON m.FieldID = n.FieldID
Where m.FieldID not in --make sure we select the rest of the records
(
   SELECT FieldID 
   FROM Table2
   HAVING COUNT(FieldID) = 1 
) AND n.FieldTime2 > 0 -- make sure to exclude the 0 records.

Veuillez noter qu'il n'a pas été testé, donc attendez-vous à des fautes de frappe, à des performances médiocres ou à des erreurs :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X