6

我正在使用Sybase ASE数据库。
我有两个看起来像的表:

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 版本中不可用。

这可能意味着将涉及一些“动态sql”(我不太清楚这意味着什么)。任何人都可以帮忙吗?

我可能想要ShopId而不是ShopName在结果表中......我还不确定。我想这不会有太大的不同。此外,结果列中的尾随逗号Sweets不是问题。我想要的只是一个非空白分隔符。

4

5 回答 5

5

You'll have to specify what DBMS you're using.

MySQL's GROUP CONCAT is exactly what you need.

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 是不可能的。

你可以用临时表创建一个存储过程,用游标填充它,然后从这个临时表中选择。

于 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

不幸的是,漂移的答案中的一个方法不适用于 Sybase ASE 的 select 语句,变量 @list 不会为每一行更新,它仅适用于最后一行。但是因为每行的更新执行和表的大小不会很大,你可以用更新语句来做。小例子:

    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 回答