想知道是否有人知道小sql脚本的技巧。
http://sqlfiddle.com/#!3/09638/3
我希望只返回有手动变速器且福特制造的行。如果不存在任何行,则返回所有福特制造的车辆。我目前正在使用IF EXIST条件。我考虑使用临时表来存储第一组数据,然后查看表的rowcount()(插入行== 0)以查看是否需要插入更多数据。可能没有其他方法可以做到这一点,然后我描述了我的两个选项。也许社区对此有一些想法。
CREATE TABLE Cars
(
Make varchar(50),
Model varchar(50),
ManualTransmission bit
);
INSERT INTO Cars
(Make, Model, ManualTransmission)
VALUES
('Ford', 'Taurus', 0),
('Ford', 'Contour', 0),
('Ford', 'Mustang', 0),
('Jeep', 'Liberty', 1),
('Jeep', 'Cherokee', 0);
答案 0 :(得分:6)
单程
WITH CTE
AS (SELECT *,
RANK() OVER (ORDER BY ManualTransmission DESC) AS Rnk
FROM Cars
WHERE Make = 'Ford')
SELECT Make,
Model,
ManualTransmission
FROM CTE
WHERE Rnk = 1
或另一个
SELECT TOP 1 WITH TIES Make,
Model,
ManualTransmission
FROM Cars
WHERE Make = 'Ford'
ORDER BY ManualTransmission DESC
这两个答案都利用了ManualTransmission
是BIT
数据类型的事实,而1
是它可以拥有的最大可能值。如果ManualTransmission
可以为空,那么您需要将它们更改为
ORDER BY ISNULL(ManualTransmission,0) DESC
或者
ORDER BY CASE WHEN ManualTransmission = 1 THEN 0 ELSE 1 END
CASE
版本也适用于更复杂的条件。
答案 1 :(得分:2)
试试这个:
select *
from (select *,
max(cast(ManualTransmission as int)) over (partition by make) as hasManual
from cars
where make = 'Ford'
) t
where hasManual = 0 or ManualTransmission = 1
答案 2 :(得分:1)
我想我发现了一种相当便宜的方法? 它似乎更便宜,因为它不需要进行任何排序
;WITH CTE AS
(
SELECT *
,HasManual = SUM(CAST(ManualTransmission AS INT)) OVER (PARTITION BY Make)
FROM Cars
)
SELECT Make, Model, ManualTransmission
FROM CTE
WHERE (Make = 'Ford' AND ManualTransmission = 1)
OR (Make = 'Ford' AND HasManual = 0)
答案 3 :(得分:0)
您可以尝试以下方法:
SELECT * FROM Cars
WHERE Make = COALESCE('Ford', Make)
AND ManualTransmission = COALESCE(1,ManualTransmission)