簡體   English   中英

在一個語句中根據兩個連接的列值選擇行 - ORACLE

[英]Choose rows based on two connected column values in one statement - ORACLE

首先,我不確定標題是否代表最佳問題。 歡迎任何更好的建議。 我的問題是我有下表:

+----+----------+-------+-----------------+
| ID | SUPPLIER | BUYER | VALIDATION_CODE |
+----+----------+-------+-----------------+
|  1 | A        | Z     |       937886521 |
|  2 | A        | X     |       937886521 |
|  3 | B        | Z     |       145410916 |
|  4 | C        | V     |      775709785  |
+----+----------+-------+-----------------+

我需要顯示有BUYER Z,X的供應商A和B.然而,我希望這個條件是一對一的關系,而不是一對多關系 也就是說,對於供應商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)。

期望的結果應該是這樣的:

+----+----------+-------+-----------------+
| ID | SUPPLIER | BUYER | VALIDATION_CODE |
+----+----------+-------+-----------------+
|  2 | A        | X     |       937886521 |
|  3 | B        | Z     |       145410916 |
+----+----------+-------+-----------------+

您可以更新WHERE子句以過濾所需的對:

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

我使用了基於你的混合案例的UPPER函數。

看看你有什么需要:

SELECT MAX(id),
       supplier, 
       MAX(buyer), 
       MAX(validation_code)
FROM
(SELECT *
 FROM Validation
 WHERE supplier IN ( 'A', 'B' ) AND buyer IN ( 'X', 'Z')
) filtered
GROUP BY supplier;

SQL小提琴

我使用GROUP BY supplier展平表格,並包括IDBuyerValidation_Code 最大值

或者,你可以試試這個:

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語句的結果以查看它的作用。

試試這個查詢:

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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM