1

これは私の質問です

Create FUNCTION [dbo].[CountUses](@couponid INT)
RETURNS INT
AS
   BEGIN
   RETURN
    (
    SELECT  c.Id,
     c.Name,
     c.CreateDate,
     Count(cu.id) NofUses
  FROM   Coupon as  c
     JOIN CouponUse as cu
       ON c.id = cu.couponid
 GROUP  BY c.Id,
     c.Name,
     c.CreateDate
     )
 END 

問題はどこOnly one expression can be specified in the select list when the subquery is not introduced with EXISTS.にあるのですか?
主な回答とは別に、クエリの最適化についてコメントをいただければ幸いです...

4

2 に答える 2

1

関数が複数の値を返すようにする場合は、テーブル値関数を確認する必要があります。

これらのタイプの関数は、1つの値だけでなく、テーブルを返します。現在の関数はスカラー関数として設定されているため、1つの値しか返すことができません。

スカラー値が必要な場合-たとえば、そのcount場合、関数は次のようになります。

Create FUNCTION [dbo].[CountUses](@couponid INT)
RETURNS INT
AS
   BEGIN
   RETURN
    (
      SELECT Count(cu.id) NofUses  --- this can only return one column
      FROM   Coupon as  c
      JOIN CouponUse as cu
        ON c.id = cu.couponid
      WHERE cu.couponid = @couponid
     )
   END 

データのテーブルを返すことを意図している場合、関数は次のようになります。

Create FUNCTION [dbo].[CountUses](@couponid INT)
RETURNS @new_table table
(
  id int,
  name varchar(50),
  CreateDate datetime,
  NofUsers int
)
AS
BEGIN
  INSERT INTO @new_table
  SELECT c.Id,
       c.Name,
       c.CreateDate,
       Count(cu.id) NofUses
      FROM   Coupon as  c
      JOIN CouponUse as cu
        ON c.id = cu.couponid
      WHERE cu.couponid = @couponid
      GROUP  BY c.Id,  c.Name,  c.CreateDate

   RETURN
END
于 2012-11-21T11:13:45.877 に答える
0

これにより、問題が修正されます。

Create FUNCTION [dbo].[CountUses](@couponid INT)
RETURNS TABLE 
AS
RETURN
(
    SELECT  c.Id,
            c.Name,
            c.CreateDate,
            Count(cu.id) NofUses
    FROM   Coupon as  c
    JOIN CouponUse as cu
         ON c.id = cu.couponid
    GROUP  BY c.Id,
              c.Name,
              c.CreateDate
) 
于 2012-11-21T11:17:02.030 に答える