2013-11-11 1 views
0

Во-первых, я не уверен, является ли заголовок наилучшим из вопросов. Любое лучшее предложение приветствуется. Моя проблема в том, у меня есть следующая таблица:Выбирайте строки на основе двух связанных значений столбца в одном выражении - ORACLE

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

Мне нужно, чтобы показать ПОСТАВЩИК A и B, которые имеют ПОКУПАТЕЛЬ Z, X. Тем не менее, я хочу, чтобы это условие было один-к-одному отношения, а не один-ко-многим. То есть, для поставщика A, я хочу показать столбец с идентификатором: 1, 2. Для поставщика B я хочу показать только столбец 3. Следующий сценарий покажет Поставщик со всеми возможными покупателями (которые я не хочу):

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 | 
+----+----------+-------+-----------------+
+0

Можете ли вы опубликовать желаемый результат в виде таблицы? –

+0

В запросе, который вы написали, не будет выдаваться вывод, который вы предоставили для данных. Пара (B, X) (B, Z) не существует в таблице. – haki

+0

@ PM77-1 Обновлено. Благодаря! – Hawk

ответ

2

Вы можете обновить ИНЕК для фильтрации нужных пар:

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

Я использовал ВЕРХНЮЮ функцию на основе ваших смешанных ситуационных примеров ,

+0

Для тех, кто собирается проверить этот ответ позже, подумайте, что я обновил вопрос. Тем не менее, эта концепция - это то, что просто решает мою проблему – Hawk

+0

, когда я использую этот ответ, он возвращает 3 строки, но ястреб сказал, что нужно 2 строки в качестве результата, может кто-нибудь объяснить мне, как этот запрос возвращает 2 строки? – Hamidreza

0

Смотрите, если это то, что вам нужно:

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 Fiddle

Я GROUP BY supplier к расплющить таблицу и включены максимальные значения ID, Buyer и Validation_Code.

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, чтобы увидеть, что он делает.

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; 
Смежные вопросы