从SELECT语句返回的单行中包含不带分组依据的已联接表

时间:2019-03-29 20:04:23

标签: c# asp.net sql-server stored-procedures

我有三个桌子。一种带有客户数据,一种带有文档,另一种带有图像。 如果文档或图像表中存在多个文档,则返回多行。我只需要返回一行。 我的应用程序中的表格行具有将其定向到每个客户ID的图像和文档页面的链接,因此在select语句中包括文档和图像文件名非常重要。 问题是同一客户ID会显示多行,因为每个客户都存在多个文档/图像。分组依据似乎对我没有帮助,因为我仍然可以获得多行。

Customer ID | Title    | Documents Link | Images Link
----------------------------------------------------
Sam Tucker  | Salesman | Link           | Link
Sam Tucker  | Salesman | Link           | Link
Sam Tucker  | Salesman | Link           | Link

SELECT DISTINCT Customer.CustomerID, Customer.Title, Documents.FileName, Images.FileName
FROM Customer
LEFT JOIN Documents
ON Customer.CustomerID = Documents.CustomerID
LEFT JOIN Images
ON Customer.CustomerID =  Images.CustomerID

这是我在select语句中需要文件名的原因。如果文件名不存在,则该链接将不可见。另外,该链接不是指向文件的实际链接,而是显示多个文件的模式。

<asp:LinkButton ID="Documents" runat="server" Text="Link" Click="MyMethod" CommandArgument='<%# Eval("CustomerID") %>' Visible='<%# string.IsNullOrEmpty(Eval("Documents.FileName").ToString()) ? false : true %>'></asp:LinkButton>

<asp:LinkButton ID="Images" runat="server" Text="Link" OnClick="MyMethod2" CommandArgument='<%# Eval("CustomerID") %>' Visible='<%# string.IsNullOrEmpty(Eval("Images.FileName").ToString()) ? false : true %>'></asp:LinkButton>

如何只返回一行?

1 个答案:

答案 0 :(得分:3)

您可以使用GroupByMAX来获得所需的结果。

SELECT Customer.CustomerID, Customer.Title, MAX(Documents.FileName), 
MAX(Images.FileName)
FROM Customer
LEFT JOIN Documents ON Customer.CustomerID = Documents.CustomerID
LEFT JOIN Images ON Customer.CustomerID =  Images.CustomerID
GROUP BY Customer.CustomerID, Customer.Title