簡體   English   中英

SQL Server:聯接上的子查詢

[英]SQL Server: Subquery on a join

我有兩個具有架構和數據的表,如下所示。 表A具有一個id和一個關聯的name 表B相關聯的idTable ApriceotherAttr 對於表A中的每個條目,表B中可能有多個價格不同的條目,但是otherAttr對於每個條目都是相同的。

給定表A的id ,我想選擇nameotherAttr和最低price

下面的查詢返回多個結果,我需要編寫一個查詢,該查詢將以最低價格返回單個結果。

SELECT a.name, b.price, b.otherAttr 
FROM A a
LEFT Join B b on b.idFromA = 1
WHERE a.id = 1


    Table A        Table B 
    id | name      idFromA | price | otherAttr
    --------       ---------------------------
    1 | A          1       | 200   | abc
    2 | B          1       | 300   | abc
                   1       | 400   | abc
                   2       | 20    | def
                   2       | 30    | def
                   2       | 40    | ef

我大大簡化了我的榜樣。 除了從表B中選擇最低價格和otherAttr,我還必須從其他表的聯接中選擇一堆其他屬性。 這就是為什么我認為Group By和Min應該是表B上聯接的子查詢,這是一種避免按我選擇的所有屬性進行分組的方法(因為按編程方式選擇了這些屬性)。

實際查詢看起來更像:

SELECT a.name, b.price, b.otherAttr, c.x, c.y, d.e, d.f, g.h....
FROM A a
LEFT Join B b on b.idFromA = 1
LEFT Join C c on something...
LEFT Join D d on something...
LEFT Join G g on something...

WHERE a.id = 1

為此,您可以在INNER查詢中使用GROUP BY:

SELECT gd.name, gd.price,gd.otherAttr, c.x, c.y, d.e, d.f, g.h....
FROM 
(SELECT a.id,a.name, MIN(b.price) as price, b.otherAttr 
FROM A a
LEFT Join B b on b.idFromA = 1
WHERE a.id = 1
GROUP BY a.id,a.name,b.otherAttr) gd
LEFT Join B b on b.idFromA = 1
LEFT Join C c on something...
LEFT Join D d on something...
LEFT Join G g on something...

嘗試:-

SELECT a.name, MIN(b.price) minprice, b.otherAttr 
FROM A a
LEFT Join B b ON a.Id = b.idFromA
GROUP BY a.name, b.otherAttr
HAVING a.id = 1

您可以改為這樣做:

SELECT a.name, MIN(b.price), MIN(b.otherAttr) 
FROM TableA a
LEFT JOIN TableB b on b.idFromA = a.id
GROUP BY a.name
HAVING a.id = 1;

除了子查詢上的id外,還需要在價格上進行內部聯接,以使價格最低的正確記錄相交。 然后,TOP(1)將僅返回這些記錄之一。 如果可以擴展條件並在子查詢中按字段分組,則可以避免使用TOP(1),這樣您的架構可以確保對於該屬性組合僅返回單個記錄。 最后,在相交集合時避免左連接。

SELECT TOP(1) p.id, p.price, b.OtherAttr
FROM B as b
INNER JOIN
    (SELECT A.id, min(B.price) as price
     FROM B
     INNER JOIN A on A.id=B.idFromA and A.ID=1
     GROUP BY A.id) as p on b.idFromA=p.id and b.price=p.price

暫無
暫無

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

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