0

まず、タイトルがその号の最高のものを表しているかどうかはわかりません. より良い提案は大歓迎です。私の問題は、次の表があることです。

+----+----------+-------+------------------+
| | ID | サプライヤー | バイヤー | VALIDATION_CODE |
+----+----------+-------+------------------+
| | 1 | あ | Z | 937886521 |
| | 2 | あ | X | 937886521 |
| | 3 | ビ | Z | 145410916 |
| | 4 | シー | V | 775709785 |
+----+----------+-------+------------------+

BUYER Z、X を持つ SUPPLIERS A と B を表示する必要があります。ただし、この条件は1 対多ではなく1対 1の関係にしたいと考えています。つまり、サプライヤーAの場合、ID:1、2の列を表示したいのです。サプライヤーBの場合、列3のみを表示したいのです。次のスクリプトは、サプライヤ A と​​考えられるすべてのバイヤーを表示します (これは望ましくありません)。

SELECT *   
FROM   validation   
WHERE  supplier IN ( 'A', 'B' )   
       AND buyer IN ( 'X', 'Z');

これにより、(A,Z)、(A,X)、(B, Z) のペアが表示されます。次のみを表示する必要があります: (A,X)(B,Z) in one statement .

望ましい結果は次のようになります。

+----+----------+-------+------------------+
| | ID | サプライヤー | バイヤー | VALIDATION_CODE |
+----+----------+-------+------------------+
| | 2 | あ | X | 937886521 |
| | 3 | ビ | Z | 145410916 |
+----+----------+-------+------------------+
4

4 に答える 4

2

WHERE 句を更新して、目的のペアをフィルタリングできます。

select *
from sample
where (upper(supplier),upper(buyer))
in (('A','X'),('A','Y'),('A','Z'),('B','X'),('B','Y'),('B','Z'));

大文字と小文字が混在する例に基づいて UPPER 関数を使用しました。

于 2013-11-11T06:06:41.127 に答える
0

または、これを試すこともできます:

SELECT id
     , supplier
     , buyer
     , validation_code 
FROM (SELECT id
             ,max(id) OVER(PARTITION BY supplier) AS maxid
             ,supplier
             ,buyer
             ,validation_code
              FROM sample) AS x
WHERE x.id=x.maxid

内部 SQL ステートメントの結果を見て、それが何をするかを確認できます。

于 2013-11-11T08:16:03.987 に答える
0

このクエリを試してください:

select ID,SUPPLIER,BUYER,VALIDATION_CODE from
(select
t2.*,t1.counter
from
validation t2,
(select supplier,count(supplier) as counter from hatest group by supplier)t1
where 
t1.supplier = t2.supplier)t3
where t3.supplier in('A','B') and
id = case when t3.counter > 1 then 
(select max(id) from validation t4 where t4.supplier = t3.supplier) else t3.id end;
于 2013-11-11T08:35:57.990 に答える