Sql server 从内部联接MSSQL中选择一行

Sql server 从内部联接MSSQL中选择一行,sql-server,inner-join,Sql Server,Inner Join,我有一个问题,我试图在网上搜索,但找不到解决问题的方法 我有两张表,一张是tblproducts,另一张是tblproductImages tblproductImages具有与tblproducts fldproductID匹配的fldProduct_FK 我想选择所有产品,但每个产品只有一个图像 希望有人能帮忙 SELECT * FROM tblProduct AS P INNER JOIN tblProductImage AS I ON P.fldProductID = I.fldPr

我有一个问题,我试图在网上搜索,但找不到解决问题的方法

我有两张表,一张是tblproducts,另一张是tblproductImages

tblproductImages具有与tblproducts fldproductID匹配的fldProduct_FK

我想选择所有产品,但每个产品只有一个图像

希望有人能帮忙

SELECT * FROM tblProduct AS P
INNER JOIN 
tblProductImage AS I
ON 
P.fldProductID = I.fldProduct_FK

对于SQL Server,这是交叉应用的完美示例

SELECT *, II.*
    FROM tblProduct AS P 
CROSS APPLY (
    SELECT top 1 * FROM tblProductImage AS I 
    where P.fldProductID = I.fldProduct_FK
  ) AS II

对于SQL Server,这是交叉应用的完美示例

SELECT *, II.*
    FROM tblProduct AS P 
CROSS APPLY (
    SELECT top 1 * FROM tblProductImage AS I 
    where P.fldProductID = I.fldProduct_FK
  ) AS II

您可以使用内部选择:

SELECT *, (SELECT TOP 1 fldImageID FROM tblProductImage WHERE fldProduct_FK = tblProduct.fldProductID)
FROM tblProduct

当然,您无法控制图像将被选中。它可能总是同一个图像,也可能不是。此外,如果找不到图像,查询将抛出错误。

您可以使用内部选择:

SELECT *, (SELECT TOP 1 fldImageID FROM tblProductImage WHERE fldProduct_FK = tblProduct.fldProductID)
FROM tblProduct


当然,您无法控制图像将被选中。它可能总是同一个图像,也可能不是。此外,如果找不到图像,查询将抛出一个错误。

您需要一些规则来从集合中选择图像,例如最早的图像、最小/更大的图像或其他。以某种方式,只需获取它得到的第一个图像?好的,我已经写了答案,请参见下文。您需要一些规则来从集合中选择图像,例如最早的图像,大多数更小/更大的图像,或者其他。以某种方式拍摄它得到的第一个图像?好的,我已经写了答案,请参见下面。不确定是谁对此进行了投票,但它的语法不正确,并且用作外部连接而不是内部连接。您的文本也不正确,它将抛出错误,因为您的语法不正确incorrect@t-dk我没有所需的方案,所以我在自己的表上检查了一个查询,它可以工作。然后我将查询转换为所需的方案,当然我可能会犯错误。@Mark。当“专家”的答案包含错误时,这是非常误导人的,因为有时OPs会同时出现打字错误和逻辑缺失的问题。在您的回答中:
TOP
只能放在字段名之前,并且只有当它返回一行一列时才允许这种嵌套查询。因此,在任何情况下,这都不是一个解决方案case@KirillSlatinsubselect将只返回一行和一列。根据问题,它应该返回1个图像,所以这部分是fine@KirillSlatin在我的回答中,我把
TOP
移到了前面。不确定是谁对此进行了投票,但这是不正确的语法,它作为外部连接而不是内部连接。您的文本也不正确,它将抛出错误,因为您的语法不正确incorrect@t-dk我没有所需的方案,所以我在自己的表上检查了一个查询,它可以工作。然后我将查询转换为所需的方案,当然我可能会犯错误。@Mark。当“专家”的答案包含错误时,这是非常误导人的,因为有时OPs会同时出现打字错误和逻辑缺失的问题。在您的回答中:
TOP
只能放在字段名之前,并且只有当它返回一行一列时才允许这种嵌套查询。因此,在任何情况下,这都不是一个解决方案case@KirillSlatinsubselect将只返回一行和一列。根据问题,它应该返回1个图像,所以这部分是fine@KirillSlatin在我的回答中,我把
移到了顶部。但是马克·舍甫琴科的话仍然有效。第二个
SELECT
语句中的
orderby
子句会让你感到烦恼,但是马克·舍甫琴科的评论仍然有效。你必须在第二个
SELECT
语句中用一个
orderby
子句来麻烦自己