6

Sybase ASEデータベースを使用しています。
次のような 2 つのテーブルがあります。

Shops:

---------------------
| ShopName | ShopID |
---------------------
| Sweetie  | 1      |
| Candie   | 2      |
| Sugarie  | 3      |
---------------------

Sweets:

----------------------
| SweetName | ShopID |
----------------------
| lolly     | 1      |
| redlolly  | 1      |
| greenloly | 1      |
| taffy     | 2      |
| redtaffy  | 2      |
| bluetaffy | 2      |
| choco     | 3      |
| mintchoco | 3      |
| milkchoco | 3      |
| gummybees | 3      |
----------------------

次のような結果を生成するクエリを書きたいと思います。

-----------------------------------------------------
| ShopName | Sweets                                 |
-----------------------------------------------------
| Sweetie  | lolly, redlolly, greenlolly            |
| Candie   | taffy, redtaffy, bluetaffy             |
| Sugarie  | choco, mintchoco, milkchoco, gummybees |
-----------------------------------------------------

どうすればいいですか?これは、Sybase ASE データベースに必要です。関数を試しましたLIST()が、エラーが発生しました。ドキュメントを確認したところ、この機能は ASE Edition では使用できないことがわかりました。

これはおそらく、「動的SQL」が関与することを意味します(それが何を意味するのかはほとんどわかりません)。誰でも助けることができますか?

ShopId結果表の代わりに欲しいかもしれShopNameません...まだよくわかりません。あまり変わらないと思います。Sweetsまた、結果の列の末尾のコンマは問題になりません。私が欲しいのは、空白以外の区切りです。

4

5 に答える 5

5

使用している DBMS を指定する必要があります。

MySQL のGROUP CONCATはまさにあなたが必要としているものです。

SELECT ShopName, GROUP_CONCAT(SweetName SEPARATOR ", ")
FROM Shops a
JOIN Sweets b
ON a.ShopID = b.ShopID
GROUP BY ShopName
于 2010-09-17T18:07:31.353 に答える
2

これはクロス集計クエリであり、Sybase ASE では 1 つのクエリでは不可能です。

一時テーブルを使用してストアド プロシージャを作成し、カーソルを挿入して、この一時テーブルから選択することができます。

于 2010-09-21T12:51:39.880 に答える
1

これを SQL Server でテストしましたが、Sybase でも動作することを願っています。そうでない場合は、問題を解決するのに十分な距離に近づくことができます。

この関数を作成すると:

CREATE FUNCTION SweetsList(@shopID int)
RETURNS varchar(500)
AS
BEGIN

    DECLARE @list varchar(500)

    SELECT @list = COALESCE(@list+', ','') + SweetName
    FROM Sweets
    WHERE ShopID = @shopID

    RETURN @list
END

次に、このクエリを実行して、必要な結果を得ることができます。

SELECT ShopName, dbo.SweetsList(ShopID) AS Sweets
FROM Shops

お役に立てれば。

于 2010-09-17T22:27:57.787 に答える
1

残念ながら、adrift's answer のメソッドは、Sybase ASE の select ステートメントでは機能しません。変数 @list は行ごとに更新されず、最後の行でのみ機能します。ただし、更新は行ごとに実行され、テーブルのサイズはそれほど大きくないため、update ステートメントで実行できます。小さな例:

    declare @list varchar(500)

    update Sweets
    set @list = @list + SweetName + ', ' 
    where ShopID = 1

    select SUBSTRING(@list, 1, Len(@list) - 2)

PS私にとっては、カーソルは良い方法ではありません...

于 2014-06-21T13:10:03.793 に答える
0

Sybase ASE で動作します...

CREATE FUNCTION SweetsList(@SN varchar(10))
returns varchar(255)
AS
DECLARE @SwNList varchar(255)
DECLARE @FetchSwN varchar(55)
DECLARE @Status INT, @Error INT

DECLARE ListCurs CURSOR FOR
SELECT SweetName
  FROM Sweets AS SW
 JOIN Shops AS SH
  ON SH.ShopID = SW.ShopID
 WHERE SH.ShopName = @SN
FOR READ ONLY

OPEN ListCurs
SELECT @Status = 0
WHILE @Status = 0
BEGIN
    FETCH ListCurs INTO @FetchSwN

    SELECT @Status = @@SQLSTATUS

    IF @Status = 0 
    BEGIN
       SELECT  @SwNList = CASE WHEN @SwNList IS NULL THEN '' ELSE @SwNList + ', ' END + @FetchSwN
    END
END
CLOSE ListCurs
RETURN (@SwNList)
go

次に実行...

SELECT ShopName, dbo.SweetsList(ShopName) AS Sweets FROM Shops
于 2015-05-21T20:00:14.040 に答える