5

関連する 3 つのテーブル "A(id, val)"、"B(id, val)"、および値が "AB(aid, bid, val)" のリンク テーブルがあります。

B に対してクエリを実行して A の値を取得しています。たとえば、次のようになります。

SELECT A.* 
FROM A INNER JOIN AB ON A.id = AB.aid INNER JOIN B ON AB.bid = B.id
WHERE B.val = 'foo';

すべての A には多くの B があり、すべての B には多くの A があります。

そして、私がバラバラになっているキャッチは、AB.valが特定のA/Bペアの最大値である場合にのみクエリが行を返すように、セットをフィルタリングする必要があることです

たとえば、データがある場合:

id   val
1    something
2    somethingelse

B

id   val
1    foo
2    bar

AB

aid  bid  val
1    1    3
1    2    2
2    1    1
2    2    4

AB の最初と最後の行のみを選択したいと思います。これらはそれぞれの A の最大値であり、B.val = 'foo' に対してクエリを実行して最初の行のみを返すことができるためです。AB テーブルの max val 行のみを制約する方法についての手がかりがありません。

私が得ることができた最高のものは

SELECT * 
FROM A 
INNER JOIN 
  (SELECT aid, bid, MAX(val) AS val FROM AB GROUP BY aid) as AB
  ON A.id = AB.aid 
INNER JOIN B ON AB.id = B.id
WHERE B.val = 'foo'

しかし、これはうまくいきません。まず、アプローチが間違っているように感じます。次に、悪い入札値を返します。つまり、サブクエリから返される入札は、必ずしも max(val) と同じ行からのものであるとは限りません。これは、列が照合またはグループ化に指定されていない場合に返される値の選択が定義されていないという既知のグループの問題であると思います。

上記のいくつかが理にかなっていることを願っています。私はこれについて過去数時間壁に頭をぶつけていました。どんな助けでも大歓迎です。ありがとう。

(疑問に思われている方のために説明すると、これの実際の使用は Dictionary バックエンドであり、A は単語テーブル、B は音素テーブルです。AB は「位置」列を持つ WordPhoneme テーブルです。クエリは、で終わるすべての単語を検索することです。指定された音素 (音素とは単語の音であり、使用法は国際音声アルファベット に似ています)

4

5 に答える 5

2

最初に各 a.id の ab の最大値を取得するには、別の結合を行う必要があると思います。

このようなもの:

select a.*
from a
left join (
    select aid, max(val) as val 
    from ab 
    group by aid
) abmax on abmax.aid=a.id
inner join ab on ab.aid=abmax.aid and ab.val=abmax.val
inner join b on b.id=ab.bid
where b.val='foo'
于 2008-10-21T04:54:33.437 に答える
1

私が試した別の方法は次のとおりです。

select a.*
from ab
   inner join b on(ab.bid=b.id)
   inner join a on (ab.aid=a.id)
where ab.val = (select max(val) from ab AS ab2 where ab2.aid = ab.aid)
   and b.val='foo'
于 2008-10-21T05:08:21.757 に答える
1

グループごとに最大のものを得るために、私はよく次のトリックを使用します。

SELECT a.*
FROM ab AS ab1
  LEFT OUTER JOIN ab AS ab2 ON (ab1.aid = ab2.aid AND ab1.val < ab2.val)
  JOIN a ON (ab1.aid = a.id)
  JOIN b ON (ab1.bid = b.id)
WHERE ab2.aid IS NULL
  AND b.val = 'foo';

秘訣は、外部結合で AB テーブルをそれ自体に結合することです。ad の値が同じで val の値がそれより大きい行が存在しない ab1 を返します。したがって、ab1 は、特定の援助値を持つ行のグループごとに最大の val を持ちます。

于 2008-10-21T06:10:27.060 に答える
0

どの SQL を使用しているかはわかりませんが、MS SQL ではテーブル値データベース関数を作成してテーブル A から最大値を返し、これをテーブル B に結合します。振り返ってみると、これは複雑な結合よりもはるかに理解しやすいと思います。後の段階で私のクエリについて。

于 2008-10-21T11:43:49.900 に答える
0
SELECT *
FROM
(
  SELECT
    A.*,
    (SELECT top 1 AB.BID FROM AB WHERE A.AID = AB.AID ORDER BY AB.val desc) as BID
  FROM A
) as Aplus
JOIN B ON Aplus.BID = B.BID
于 2008-10-21T14:22:04.243 に答える