簡體   English   中英

SQL(使用select語句進行內部聯接)

[英]SQL(inner join with select statement)

我有2張桌子拍賣和客戶

拍賣

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

您必須在內部查詢中添加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

另請參見此SQL提琴

這樣嘗試

     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;

內部select缺少cust_id 為什么要使用內部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
;

暫無
暫無

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

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