我有两个包含架构和数据的表,如下所示。表A包含id
和关联的name
。表B将id
的{{1}}与Table A
和price
相关联。对于表A中的每个条目,表B中可能有多个条目具有不同的价格,但otherAttr
对于每个条目都是相同的。
鉴于表A的otherAttr
,我想选择id
,name
和最低otherAttr
。
以下查询返回多个结果,我需要编写一个以最低价格返回单个结果的查询。
price
我大量过度简化了我的例子。除了从表B中选择min price和otherAttr之外,我还必须从其他表的连接中选择一堆其他属性。这就是为什么我认为Group By和Min应该是表B中连接的子查询,作为一种避免分组的方法我选择的所有属性(因为选择的属性以编程方式变化)。
实际查询看起来更像:
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
答案 0 :(得分:4)
为此,您可以在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...
答案 1 :(得分:1)
尝试: -
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
答案 2 :(得分: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;
答案 3 :(得分:0)
除了子查询上的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