11

したがって、これに対する解決策を見たと思いますが、それらはすべて非常に複雑なクエリです。私は参考のためにOracle 11gにいます。

私が持っているのは、単純な1対多の結合です。これはうまく機能しますが、多くは必要ありません。左のテーブル (1 つ) を、結合基準を満たす任意の 1 行に結合したいだけです...多くの行ではありません。

クエリが COUNTS のロールアップにあるため、これを行う必要があるため、通常の左結合を行うと、1 しか得られないはずの 5 行が得られます。

したがって、データの例は次のとおりです。

TABLE 1:
-------------
TICKET_ID      ASSIGNMENT
5              team1
6              team2

TABLE 2:
-------------
MANAGER_NAME   ASSIGNMENT_GROUP  USER
joe            team1             sally
joe            team1             stephen
joe            team1             louis
harry          team2             ted
harry          team2             thelma

ASSIGNMENT=ASSIGNMENT_GROUP でこれら 2 つのテーブルを結合する必要がありますが、返される行は 1 行だけです。

左結合を行うと、左結合の性質である 3 つの行が返されます。

4

6 に答える 6

11

Oracle が行番号 (partition by) をサポートしている場合、行が 1 に等しい場所を選択するサブクエリを作成できます。

SELECT * FROM table1
LEFT JOIN
(SELECT *
FROM   (SELECT *,
           ROW_NUMBER()
             OVER(PARTITION BY assignmentgroup ORDER BY assignmentgroup) AS Seq
    FROM  table2) a
WHERE  Seq = 1) v
ON assignmet = v.assignmentgroup
于 2012-04-19T20:45:38.107 に答える
10

あなたはこのようなことをすることができます。

SELECT t1.ticket_id, 
       t1.assignment,
       t2.manager_name,
       t2.user
  FROM table1 t1
       LEFT OUTER JOIN (SELECT manager_name,
                               assignment_group,
                               user,
                               row_number() over (partition by assignment_group
                                                    --order by <<something>>
                                                 ) rnk
                          FROM table2) t2
                     ON (    t1.assignment = t2.assignment_group
                         AND t2.rnk = 1 )

table2これにより、データがによって分割されassignment_group、任意にランク付けされて、ごとに1つの任意の行がプルされますassignment_group。どの行が返されるかを気にする場合(または返される行を決定論的にしたい場合)ORDER BY、分析関数に句を追加できます。

于 2012-04-19T20:52:27.263 に答える
2

GROUP BY必要なのはASSIGNMENT_GROUPフィールドで使うことだと思います。

http://www.w3schools.com/sql/sql_groupby.asp

于 2012-04-19T20:32:10.260 に答える
1

MySQLでは、割り当てによってグループ化するだけで完了できます。Oracleはより厳密であり、3つの行のどの値を選択するかを(未定義の方法で)選択することを拒否します。つまり、返されるすべての列はGROUP BYの一部であるか、aggregat関数(COUNT、MIN、MAX ...)の対象である必要があります。

もちろん、気にしないで、返された列にいくつかのaggregat関数を使用することを選択できます。

select TICKET_ID, ASSIGNMENT, MAX(MANAGER_NAME), MAX(USER)
from T1
left join T2 on T1.ASSIGNMENT=T2.ASSIGNMENT_GROUP
group by TICKET_ID, ASSIGNMENT

そうすれば、そもそもJOINが必要だとは真剣に疑うでしょう。

MySQLは、列のグループ値の文字列連結が必要な場合(人間はしばしばそのようなものです)、GROUP_CONCATにも役立ちますが、Oracleの場合は驚くほど複雑です。

すでに提案されているようにサブクエリを使用することはオプションです。例については、こちらをご覧ください。また、一番上の行を選択する前にサブクエリを並べ替えることもできます。

于 2012-04-19T20:51:03.730 に答える
1

Oracle では、1 つの結果が必要な場合は、ROWNUMステートメントを使用してクエリの最初の N 個の値を取得できます。

SELECT *
FROM TABLEX
WHERE
ROWNUM = 1 --gets the first value of the result

この単一のクエリの問題は、Oracle が同じ順序でデータを返さないことです。したがって、rownum を使用する前にデータをオーダーする必要があります。

SELECT *
FROM
    (SELECT * FROM TABLEX ORDER BY COL1)
WHERE
ROWNUM = 1

あなたの場合、必要な結果は 1 つだけのように見えるため、クエリは次のようになります。

SELECT *
FROM
    TABLE1 T1
    LEFT JOIN 
    (SELECT *
    FROM TABLE2 T2 WHERE T1.ASSIGNMENT = T2.ASSIGNMENT_GROUP
    AND
    ROWNUM = 1) T3 ON T1.ASSIGNMENT = T3.ASSIGNMENT_GROUP
于 2012-04-19T20:48:28.603 に答える
-2

サブクエリを使用できます-上位1を選択

于 2012-04-19T20:34:50.680 に答える