2014-02-14 5 views
0

У меня есть 2 таблицы аукцион и клиентSQL (внутреннее соединение с отборным заявлением)

аукцион

custId|itemName|yearsUsed|bidPrice 
    1 | MacBook| 2 | 1500 
    3 | Dell | 1 | 1000 
    2 | MacBook| 2 | 1500 

клиент

custId|custName 
    1 | tom 
    2 | jerry 
    3 | susan 

Я хочу запросить для тех имени клиентов, имя элемента и цена торгов для тех, кто предложил такую ​​же цену за товар и годы, используемые владельцем также

Следующий запрос возвращает имя элемента, который имеет ту же цену торгов по клиентам

SELECT ac.itemName, 
     ac.yearsUsed, 
     ac.bidPrice 
    FROM auction ac 
GROUP BY ac.itemName, 
     ac.yearsUsed, 
     ac.bidPrice 
    HAVING COUNT(*) > 1; 

выход

itemName yearsUsed bidPrice 
---------------------------- 
MacBook  2  1500 

Теперь я хочу, чтобы запросить имя клиента, который ставку по той же цене за пункт

SELECT ac.itemName, 
     ac.yearsUsed, 
     ac.bidPrice 
    FROM auction ac 
     INNER JOIN (
        SELECT custName 
         FROM customer 
        ) c 
       ON c.custId = ac.custId 
GROUP BY ac.itemName, 
     ac.yearsUsed, 
     ac.bidPrice 
    HAVING COUNT(*) > 1; 

Я получаю сообщение об ошибке

ERROR at line 1: 
ORA_00904:"C"."CUSTID": invalid identifier 

Я использую sqlplus

ответ

4

Вы должны добавить custid во внутренний запрос.

SELECT 
    ac.itemName, 
    ac.yearsUsed, 
    ac.bidPrice 
FROM 
auction ac INNER JOIN 
    (SELECT custName, 
     -- The following CUSTID was missing: 
    CUSTID 
    FROM customer) c ON c.custId = ac.custId 
GROUP BY ac.itemName,ac.yearsUsed,ac.bidPrice 
HAVING COUNT(*) > 1; 

Однако, в вашем случае, подзапрос не нужно.

SELECT 
    ac.itemName, 
    ac.yearsUsed, 
    ac.bidPrice 
FROM 
auction ac INNER JOIN 
customer c ON c.custId = ac.custId 
GROUP BY 
    ac.itemName, 
    ac.yearsUsed, 
    ac.bidPrice 
HAVING COUNT(*) > 1; 

Если вам также необходимо, в соответствии с вашим комментарием, имена клиентов, то вам нужно идти с аналитическим выражением count(*) over(...):

select 
    custName, 
    itemName, 
    yearsUsed, 
    bidPrice 
from (
    SELECT 
    c.custName, 
    ac.itemName, 
    ac.yearsUsed, 
    ac.bidPrice, 
    count(*) over (partition by 
        ac.itemName, 
        ac.yearsUsed, 
        ac.bidPrice) cnt 
    FROM 
    auction ac INNER JOIN 
    customer c ON c.custId = ac.custId 
) 
where 
    cnt > 1 

see also this SQL fiddle

+0

первый запрос SQL не возвращает имя клиента, и это то, что я борюсь с, потому что мне нужно, чтобы вывести имя клиента, который предложил цену такую ​​же цену за предмет, а – user3213758

+0

Какое имя клиента вы хотите, * tom * или * jerry *, и почему? –

+0

Мне нужно вывести оба их имени, потому что у них была ставка за ту же цену за пункт «Macbook», а также на itemName, yearUsed и bidPrice за эту ошибку «Macbook» – user3213758

0

Try как этот

 SELECT 
ac.itemName, 
ac.yearsUsed, 
ac.bidPrice, 
c.custName 
FROM auction ac 
LEFT JOIN customer c ON c.custId = ac.custId 
GROUP BY ac.itemName,ac.yearsUsed,ac.bidPrice 
HAVING COUNT(*) > 1; 
+0

. не выражение GROUP BY – user3213758

0

cust_id отсутствует во внутреннем select. Зачем использовать внутренний select?

select ac.itemname 
,  ac.yearsused 
,  ac.bidprice 
from auction ac 
inner 
join customer c 
on  c.custid = ac.custid 
group 
by  ac.itemname 
,  ac.yearsused 
,  ac.bidprice 
having count(*) > 1 
; 
+0

Я не очень хорошо разбираюсь в sql. поэтому я пробую варианты, которые приходят мне на ум, чтобы достичь моего вывода – user3213758

+0

@ user3213758: Тогда просто используйте 'join'. Внутренний 'select' ничего не добавляет. –

+0

alright спасибо за ваш совет – user3213758

Смежные вопросы