-3

MAINテーブルT1があり、そこから多くのフィールドを選択しています。

ID
1000

私はテーブルT2を持っています:

ID      SERVICE
1000    IPTV
1000    VOIP

私はテーブルT3を持っています:

ID      DEVICE
1000    MODEM
1000    ROUTER
1000    DVC

T1をT2またはT3と結合したいのですが、値がまったくない場合もあります!!!! それらがT2またはT3からの最大レコード数のSELECTレコード数に入れたい値を持っている場合。したがって、この場合、T3には最大で3つのレコードがあり、SELECTに3つのレコードが必要です。(T2に3つのレコードがある場合、T3に2つのレコードがある場合に最大になります)

しかし、私のSELECTステートメントには、不要な5つのレコードがあります。そのための正しい表現は何ですか?以下のクエリは5つのレコードを返します(3つ欲しい)

select t1.id,t2.service,t3.device
from t1
left outer join T2 on t1.id=t2.id
left outer join T3 on t1.id=t3.id
4

2 に答える 2

1
SELECT
    t1.id
  , t2.service
  , t3.device
FROM
        t1
    LEFT JOIN
            ( SELECT
                  ROW_NUMBER() OVER (PARTITION BY id ORDER BY service) AS rn
                , id
                , service
              FROM
                  t2
            ) AS t2
        FULL JOIN 
            ( SELECT
                  ROW_NUMBER() OVER (PARTITION BY id ORDER BY device) AS rn
                , id
                , device
              FROM
                  t3
            ) AS t3
          ON  t3.id = t2.id
          AND t3.rn = t2.rn
      ON COALESCE(t2.id, t3.id) = t1.id ;
于 2012-07-07T19:44:25.960 に答える
0

この要件は正しく聞こえませんが、以下は機能するはずです

SELECT T1.*, z2.ID, z2.SERVICE FROM 
(
  SELECT ID, CASE WHEN SUM(INDICATOR) >=0 THEN 1 ELSE -1 END AS INDICATOR FROM
    (
    SELECT ID, SERVICE, 1 AS INDICATOR FROM t2
    UNION ALL
    SELECT ID , DEVICE AS SERVICE , -1 AS INDICATOR FROM t3
    ) z
  GROUP BY ID
) z1
INNER JOIN
(
  SELECT ID, SERVICE, 1 AS INDICATOR FROM t2
  UNION ALL
  SELECT ID , DEVICE AS SERVICE, -1 AS INDICATOR FROM t3
) z2
ON z1.ID = z2.ID AND z1.INDICATOR = z2.INDICATOR
RIGHT JOIN T1 ON T1.ID = Z2.ID
于 2012-07-07T19:29:29.497 に答える