1

物の寸法を調べているのですが、大きいものから小さいものまで3つの寸法を知りたいです。

だからここに私が書いた一種の気まぐれな関数があります:

CREATE FUNCTION dbo.SortDimensions
    ( @aDim1 udt_Dimension
    , @aDim2 udt_Dimension
    , @aDim3 udt_Dimension 
    )
RETURNS @rDimensions TABLE 
    ( Dim1 udt_Dimension
    , Dim2 udt_Dimension
    , Dim3 udt_Dimension 
    )
AS
BEGIN
  ; WITH OrderedDims ( Dimension ) AS ( 
                SELECT @aDim1
      UNION ALL SELECT @aDim2
      UNION ALL SELECT @aDim3
   )
  ,      Pairs ( Name, Value ) AS ( 
      SELECT 'Dim' + CAST( ROW_NUMBER() OVER (ORDER BY( Dimension ) DESC ) AS varchar ), Dimension 
        FROM OrderedDims 
  )
  INSERT INTO @rDimensions ( Dim1, Dim2, Dim3 )
      SELECT MAX(Dim1), MAX(Dim2), MAX(Dim3) 
        FROM Pairs 
      PIVOT ( MAX(Value) FOR Name IN ( [Dim1], [Dim2], [Dim3] )) p

  RETURN
END

これは、これと同じことをするのに大変な作業ではありませんか?

DECLARE @lDim1 udt_Dimension
DECLARE @lDim2 udt_Dimension 
DECLARE @lDim2 udt_Dimension

IF @aDim2 > @aDim1 
  BEGIN
    SELECT @lDim1 = @aDim2 
         , @lDim2 = @aDim1
  END
ELSE 
  BEGIN 
    SELECT @lDim1 = @aDim1 
         , @lDim2 = @aDim2
  END

IF NOT @aDim3 > @aDim2 
  BEGIN 
    SET @lDim3 = @aDim3
  END
ELSE
  BEGIN
    SET @lDim3 = @lDim2
    IF @aDim3 > @lDim1 
      BEGIN
        SET @lDim2 = @lDim1
        SET @lDim1 = @aDim3
      END
    ELSE 
      BEGIN
        SET @lDim2 = @aDim3
      END
  END 

INSERT INTO @rDimensions VALUES ( @lDim1, @lDim2, @lDim3 )

DBA は、SQL サーバーを設計した人が変数の一時テーブルのテクノロジを再利用したため、テーブルと変数の間のほとんどのウォッシュであると私に言ったと思います。(もしそれが真実でないなら、どうぞ、この考えを私から誤解させてください。)

4

1 に答える 1

1

私はこれがより速いはずだと確信しています:

CREATE FUNCTION dbo.SortDimensions
    ( @aDim1 udt_Dimension
    , @aDim2 udt_Dimension
    , @aDim3 udt_Dimension 
    ) RETURNS TABLE
AS RETURN
(
    WITH cte As (     SELECT @aDim1 As Dim
            UNION All SELECT @aDim2
            UNION ALL SELECT @aDim3
    )
    , cte2 As ( SELECT Dim, ROW_NUMBER() OVER(ORDER BY Dim) As Odr FROM cte )
    SELECT  
            MAX(CASE WHEN Odr=1 THEN Dim ELSE NULL END) As Dim1,
            MAX(CASE WHEN Odr=2 THEN Dim ELSE NULL END) As Dim2,
            MAX(CASE WHEN Odr=3 THEN Dim ELSE NULL END) As Dim3
    FROM    cte2
)
于 2013-08-25T02:13:37.483 に答える