Sql-Server

在加入 3 個表 mssql 時從第三個表中獲取前 1 行值

  • March 19, 2019

我是 mssql 的新手。這裡我需要使用三個表之間的連接來獲取一些數據。

標題連接連接圖像->結果

標題表:

在此處輸入圖像描述

行表:

在此處輸入圖像描述

對於每個標題記錄,我們可以有多個行項目。

圖片表:

在此處輸入圖像描述

每個圖像將具有唯一的圖像或多個圖像。需要從標題記錄的項目列表中獲取 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'

此查詢返回多行。但我需要為每個 Header 記錄一個唯一的行。

誰能幫我解決。

您可以只使用每個特定標題CROSS APPLYSELECTTOP 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

您可以在ORDER BY內部添加一個CROSS APPLY以確定將選擇哪個圖像。如果您希望即使在沒有來自操作員的匹配記錄時也顯示標題行,您也可以將 更改為CROSS APPLY(該列將為)。OUTER APPLY``APPLY``IMAGE``NULL

但我需要為每個 Header 記錄一個唯一的行。

對我來說,不清楚您是指每個HT.O_ID返回的所有四列都有一個唯一記錄還是沒有重複記錄。

如果是後者,請將DISTINCT關鍵字添加到您的查詢中(並添加架構名稱)。

SELECT DISTINCT HT.O_ID,
          HT.Type,
          HT.Total,
          IT.Image 

   FROM dbo.HEADER_TABLE HT 
   JOIN dbo.LINE_ITEM_TABLE LIT 
   ON LIT.O_ID = HT.O_ID 
   JOIN dbo.IMAGE_TABLE IT 
   ON IT.Item_ID = LIT.ITEM_ID 
   WHERE IT.SECTION = 'Retail';

結果

O_ID    Type    Total   Image
1001    Online  $10 URL

如果這不能解決它

然後,您必須按 And 中的值進行分組,Header_Table並決定Image您需要保留哪些,對其進行連接,…。

SELECT HT.O_ID,
      HT.Type,
      HT.Total,
      MAX(IT.Image) as MaxURL

FROM dbo.HEADER_TABLE HT 
JOIN dbo.LINE_ITEM_TABLE LIT 
ON LIT.O_ID = HT.O_ID 
JOIN dbo.IMAGE_TABLE IT 
ON IT.Item_ID = LIT.ITEM_ID 
WHERE IT.SECTION = 'Retail'
GROUP BY HT.O_ID,HT.Type,HT.Total;

測試數據

CREATE TABLE dbo.HEADER_TABLE(O_ID int,Type varchar(100),Total varchar(10))
INSERT INTO dbo.HEADER_TABLE(O_ID,Type,Total)
VALUES  (1001,'Online','$10');

CREATE TABLE dbo.LINE_ITEM_TABLE(ID int,O_ID int,Item_ID varchar(4),Line_Total varchar(10));
INSERT INTO dbo.LINE_ITEM_TABLE(ID,O_ID,Item_ID,Line_Total)
VALUES  (1,1001,'P001','$2'),
       (2,1001,'P002','$2'),
       (3,1001,'P003','$2'),
       (4,1001,'P004','$2'),
       (5,1001,'P005','$2');


CREATE TABLE dbo.IMAGE_TABLE(Item_ID varchar(10),Image varchar(100),Section varchar(10))
INSERT INTO dbo.IMAGE_TABLE 
VALUES  ('P001','URL','Retail'),
       ('P002','URL','Retail'),
       ('P003','URL','Stock'),
       ('P004','URL','Retail'),
       ('P005','URL','Retail');

引用自:https://dba.stackexchange.com/questions/232523