1

私はtable_1を持っています:

id  custno
1   1
2   2
3   3

および table_2:

id  custno  qty  descr
1   1       10   a
2   1       7    b
3   2       4    c
4   3       7    d
5   1       5    e
6   1       5    f

このクエリを実行して、すべての顧客からの最小注文数量を表示すると、次のようになります。

SELECT DISTINCT table_1.custno,table_2.qty,table_2.descr 
FROM table_1 
LEFT OUTER JOIN table_2 
    ON  table_1.custno = table_2.custno AND  qty = (SELECT MIN(qty) FROM table_2 
WHERE table_2.custno = table_1.custno   )

次に、次の結果が得られます。

custno qty  descr
1      5    e 
1      5    f
2      4    c
3      7    d

顧客 1 は、同じ最小数量 (および異なる説明) で毎回 2 回表示されますが、顧客 1 が表示されるのは 1 回だけです。それが説明として「e」を含むレコードであろうと、説明として「f」を含むレコードであろうと、私は気にしません。

4

3 に答える 3

3

まず第一に...最初にtable_1クエリに含める必要がある理由がわかりません:

select  custno, min(qty) as min_qty 
from    table_2 
group   by custno;

ただし、質問に含まれていない必要な他の情報がある場合に備えて:

select table_1.custno, ifnull(min(qty),0) as min_qty
from   table_1 
       left outer join table_2 
          on table_1.custno = table_2.custno 
group  by table_1.custno;
于 2013-11-11T21:29:45.523 に答える
1

「一般的な」SQL の方法:

SELECT table_1.custno,table_2.qty,table_2.descr 
FROM table_1, table_2 
WHERE table_2.id = (SELECT TOP 1 id 
                    FROM table_2 
                    WHERE custno = table_1.custno 
                    ORDER BY qty )

SQL 2008 の方法 (おそらく高速):

SELECT custno, qty, descr 
FROM
(SELECT 
    custno, 
    qty, 
    descr,
    ROW_NUMBER() OVER (PARTITION BY custno ORDER BY qty) RowNum
    FROM table_2
) A
WHERE RowNum = 1
于 2013-11-11T21:32:53.537 に答える
0

使用する場合は、次を使用できSQL-Serverます。ROW_NUMBERCTE

WITH CTE AS
(
    SELECT table_1.custno,table_2.qty,table_2.descr,
       RN = ROW_NUMBER() OVER ( PARTITION BY table_1.custno
                                Order By table_2.qty ASC)
    FROM table_1 
    LEFT OUTER JOIN table_2 
        ON  table_1.custno = table_2.custno 
)
SELECT custno, qty,descr
FROM CTE
WHERE RN = 1

Demolink

于 2013-11-11T21:33:07.963 に答える