2017-02-02 11 views
2

私はこれらの2つのテーブルを変更できません。両方のテーブルを照会して結合しようとしています。理想的には、同じFieldIDに対して2つ以上の結果がある場合、FieldTime2が0である行を省略することを組み合わせることが理想的です。 FieldTime2が0で、結果が1つだけの場合は、その行を表示します。2つのテーブルを結合するときに2番目のテーブルに結果を結合する

Table2のFieldIDを数え、countが1以上の場合は数値を割り当てることができますか?

表1

​​

表2

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

所望の出力:

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

マイ出力:

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 
+0

複数のレコードがある場合は、常に1つの値があり、他の値は0か、値> 0の倍数ですか? – JanR

+0

複数のレコードでは、1つだけが0になります。 – DatTrish

+0

0以外のすべてのレコードを表示しますか? – JanR

答えて

0

頭に浮かぶ最も簡単な解決策は、このように、クエリのJOIN LEFTを使用することです:複数の非ゼロのレコードは表2つのみである場合

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 

あなたのデータサンプル、およびのみ1 FieldTimeとがあるであろうという仮定に基づいて

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 
+0

これは値が0のレコードが1つしかない場合には正しくありません。OPの要求に従って:「FieldTime2が0で、結果が1つだけの場合は、その行を表示します。 – JanR

+1

コメントありがとうございます。私はOPのコメントの前に最初の解決策を提供しました。今、私は両方の解決策を持っています – cha

+0

ありがとう、私は両方のソリューションを試して、最初に実際に働いた。テーブル2の2つのエントリ(1つが0、もう1つが5など)の場合、解は5だけ表示され、0のエントリが1つだけの場合は0のエントリが表示されます。 – DatTrish

0

:希望されるクエリは、少し複雑になりますあなたは単にあなたの問題を解決するためにMAX()を使用することができ:もちろん

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 

をおUNIONを使用して、あなたの問題を解決することができ、その場合にはvalue > 0を持つ複数のFieldTimeレコードがあることができれば、この解決策は正しい出力をレンダリングしません。 :

--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. 

これはテストされていないため、誤植や性能低下、間違いがあることに注意してください。 :)

+0

ありがとう、私もこれを試してみます。私はあなたに代理人をくれましたが、私は15代の代理人であるので、それは表示されません。私はあなたの助けに感謝します。 – DatTrish

関連する問題