[英]SQL Server: Subquery on a join
我有兩個具有架構和數據的表,如下所示。 表A具有一個id
和一個關聯的name
。 表B相關聯的id
從Table A
與price
和otherAttr
。 對於表A中的每個條目,表B中可能有多個價格不同的條目,但是otherAttr
對於每個條目都是相同的。
給定表A的id
,我想選擇name
, otherAttr
和最低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.