Sql-Server
在加入 3 個表 mssql 時從第三個表中獲取前 1 行值
我是 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 APPLY
中SELECT
的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
您可以在
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');