从第三个表中获取前 1 行值,同时加入 3 个表 mssql

Zhu*_*Zhu 4 join sql-server stored-procedures sql-server-2012

我是 mssql 的新手。在这里我需要使用三个表之间的连接来获取一些数据。

Header join Lines join Images --> 结果

标题表:

在此处输入图片说明

行表:

在此处输入图片说明

对于每个标题记录,我们可以有多个行项目。

图像表:

在此处输入图片说明

每个图像将具有唯一图像或多个图像。需要从标题记录的项目列表中获取 1 个图像 url。

结果集:

在此处输入图片说明

询问 :

SELECT HT.O_ID,
       HT.Type,
       HT.Total,
       IM.Image 

FROM HEADER_TABLE HT 

JOIN LINE_ITEM_TABLE LIT 
ON LIT.O_ID = HT.O_ID 

JOIN IMAGE_TABLE IT 
ON IT.IMAGE = LIT.ITEM_ID 

WHERE IT.SECTION = 'Retail'
Run Code Online (Sandbox Code Playgroud)

此查询返回多行。但我需要为每个标题记录一个唯一的行。

谁能帮我修一下。

EzL*_*zLo 5

您可以使用CROSS APPLYSELECT刚刚TOP 1从每个特定的标题图片。APPLY类似于您可以“随时随地”创建的函数,该函数将外部的列或表达式链接到其过滤器或联接。

SELECT
    -- Header columns:
    HT.O_ID,
    HT.Type,
    HT.Total,

    -- Columns from the CROSS APPLY result
    I.Image
FROM 
    HEADER_TABLE HT 
    CROSS APPLY (
        SELECT TOP 1 -- Just retrieve 1 row (for each HT row)
            IT.IMAGE
        FROM
            LINE_ITEM_TABLE LIT
            INNER JOIN IMAGE_TABLE IT ON IT.ITEM_ID = LIT.ITEM_ID
        WHERE
            LIT.O_ID = HT.O_ID AND  -- Link the outmost header "HT" record to it's lines "LIT"
            IT.SECTION = 'Retail') AS I
Run Code Online (Sandbox Code Playgroud)

您可以添加一个ORDER BYinsideCROSS APPLY来确定将选择哪个图像。您也可以更改CROSS APPLYOUTER APPLY,如果你想标题行显示,即使没有来自未来的不匹配记录APPLY操作员(IMAGE列会NULL)。