带有 2 个内部联接的 SQL Server 2014 STUFF

Posted

技术标签:

【中文标题】带有 2 个内部联接的 SQL Server 2014 STUFF【英文标题】:SQL Server 2014 STUFF with 2 Inner Join 【发布时间】:2020-11-20 09:42:38 【问题描述】:

我的问题与Use STUFF with INNER JOIN Query 非常相似,但我一直在尝试如果第一列是varchar 类型怎么办,目前这是我的表。至于注意我使用的是 SQL Server 2014

表客户

Cust_ID | Cust_Name        
--------+---------
 1      | Name1
 2      | Name2

餐桌顺序

Order_ID | Order_NO | Cust_ID
---------+----------+---------
 1       | No.001   |   1
 2       | No.002   |   2

表格项

 Item_ID | Order_ID | Item_Name | Quantity | Price         
 --------+----------+-----------+----------+-------
 1       |   1      |   A       |    1     | 10
 2       |   1      |   B       |    1     | 20
 3       |   1      |   C       |    1     | 30
 4       |   2      |   D       |    1     | 40

我尝试过的几个查询:

SELECT 
    TBL_Sales_SO.SO_NO AS int, Tbl_Customer.Customer_Name, 
    ITEMS = STUFF ((SELECT DISTINCT ',' + TBL_SO_LIITEM.Item_Name
                    FROM Tbl_Customer
                    INNER JOIN TBL_Sales_SO ON Tbl_Customer.Com_Customer_ID =  TBL_Sales_SO.Com_Customer_ID
                    INNER JOIN TBL_SO_LIITEM ON TBL_Sales_SO.Sales_SO_ID = TBL_SO_LIITEM.Sales_So_ID
                    WHERE TBL_Sales_SO.SO_NO = TBL_Sales_SO.Sales_SO_ID
                    FOR XML PATH('')), 1, 1,'')
FROM 
    TBL_Sales_SO, Tbl_Customer
ORDER BY 
    SO_NO

以及我认为几乎命中的查询

SELECT 
    TBL_Sales_SO.SO_NO, Tbl_Customer.Customer_Name, TBL_SO_LIITEM.Item_Name,
    TBL_SO_LIITEM.Quantity, TBL_SO_LIITEM.Price
FROM 
    ((Tbl_Customer
INNER JOIN 
    TBL_Sales_SO on Tbl_Customer.Com_Customer_ID = TBL_Sales_SO.Com_Customer_ID)
INNER JOIN 
    TBL_SO_LIITEM on TBL_Sales_SO.Com_Customer_ID = TBL_SO_LIITEM.Sales_So_ID)

在修改第一个代码时给了我一些不同的错误,第二个我只是不确定如何使像我的目标这样的东西成为可能

Order_No |   Name      | Item_Name | Quantity | Price         
 no.001  |   Name1     |   A,B,C   |    3     | 60
 no.002  |   Name2     |   D       |    1     | 40

更新 按照 Gordon 的回答,我再次修改代码,管理到下表

Order_No|   Name      | Item_Name         
no.001  |   Name1     |   A,B,C   
no.001  |   Name2     |   D
no.002  |   Name2     |   D 
no.002  |   Name1     |   A,B,C

以及我使用的查询:

SELECT 
    s.SO_NO AS int, c.Cust_Name, 
    ITEMS = STUFF((SELECT DISTINCT ','+ Item_Name
                   FROM TBL_SO_LIITEM item
                   INNER JOIN TBL_Sales_SO s ON s.Sales_SO_ID = item.Sales_So_ID
                   WHERE c.Cust_ID = s.Cust_ID
                   FOR XML PATH('')), 1, 1, '')
FROM
    TBL_Sales_SO s, Tbl_Customer c
WHERE 
    c.Cust_Name IN ('Name1','Name2') 
ORDER BY 
    SO_NO   

【问题讨论】:

这能回答你的问题吗? Comma separated results in SQL, string_agg for sql server pre 2017 感谢建议,尝试了建议后,还是不行,可能是因为只有一张表,当我把它和我的数据结合起来时,它不起作用,它显示重复值,第一个建议重复custname 而第二个重复我的项目值而不是添加它 进化!没有人应该使用old style joins。这可能是为什么事情“不起作用”的一个问题,因为您在最外层的查询中交叉连接。更糟糕的是您同时使用了这两种连接样式。不一致的编码风格是个坏习惯。 谢谢你的建议,我也因为我的混乱代码而被责骂..任何了解这个@SMor的指针 【参考方案1】:

你似乎想要:

SELECT s.SO_NO AS int, c.Customer_Name, 
       STUFF( (SELECT DISTINCT ',' + oi.Item_Name
               FROM TBL_SO_LIITEM oi
               WHERE s.Sales_SO_ID = oi.Sales_So_ID
               FOR XML PATH('')), 1, 1,''
            ) as items
FROM TBL_Sales_SO s JOIN
     Tbl_Customer c
     ON s.cust_id = c.cust_id
ORDER BY SO_NO;

请注意,这些表只包含一次,无论是在子查询中还是在外部查询中。您的数据的命名约定非常不一致,所以以上是我的最佳猜测。

【讨论】:

感谢您的见解,我认为我还稍微巧妙地编辑了这个问题,只需要为有点重复的线索提供线索 @yosuacahyadi 。 . .运行我的答案中的代码。不是在FROM 子句中使用, 的损坏代码。 啊,是的,from 子句有效,而 stuff 子句缺少一些参数,我将在我的问题中添加完整的代码,再次......谢谢你的洞察力

以上是关于带有 2 个内部联接的 SQL Server 2014 STUFF的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 2005 - 内部联接的顺序

基于 SQL Server 2008 中列值的内部联接

SQL Server-交叉联接内部联接基础回顾

带有内部联接的sql更新和位置

带有内部联接的 SQL 更新查询语法

带有内部联接的 SQL 插入试图插入错误的列