1

誰かが小さな SQL スクリプトのトリックを知っているかどうか疑問に思っています。

http://sqlfiddle.com/#!3/09638/3

マニュアル トランスミッションを備えた Ford 製の行のみを返したいと考えています。行が存在しない場合は、Ford 製のすべての車両を返します。私は現在、IF EXIST条件を使用してそれを行っています。一時テーブルを使用して最初のデータ セットを格納し、テーブルの rowcount() (挿入された行数 == 0) を調べて、さらにデータを挿入する必要があるかどうかを確認しました。私が説明した2つのオプション以外にそれを行う方法はないかもしれません。たぶん、コミュニティはそれについていくつかの考えを持っています。

DDL の例

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);
4

4 に答える 4

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 

これらの答えは両方ともManualTransmissionBITデータ型で1あり、それが持つことができる最大の値であるという事実を利用しています。null許容型の場合ManualTransmissionは、次のように変更する必要があります。

ORDER BY ISNULL(ManualTransmission,0) DESC

または

ORDER BY CASE WHEN ManualTransmission = 1 THEN 0 ELSE 1 END

このCASEバージョンは、より複雑な条件にも適応できます。

于 2013-01-07T20:26:26.670 に答える
2

Try this:

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
于 2013-01-07T20:30:26.217 に答える
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)
于 2013-01-07T20:58:43.410 に答える
0

次のことを試すことができます。

SELECT * FROM Cars
 WHERE Make = COALESCE('Ford', Make)
   AND ManualTransmission = COALESCE(1,ManualTransmission)
于 2013-01-07T20:26:56.560 に答える