我有一個很難用語言表達的問題,但我希望使用所需的輸出將有助于澄清我在問什么。
我有三張桌子。第一個表包含 CustomerID 和名稱:
CREATE TABLE #CustomerTable1
(
CustomerID VARCHAR(25),
CustomerName VARCHAR(25)
)
INSERT INTO #CustomerTable1
VALUES ('0156', 'Frank'), ('0178', 'Darrull'),
('0908', 'Mary'), ('0785', 'Bertha')
CustomerID CustomerName
-------------------------
0156 Frank
0178 Darrull
0908 Mary
0785 Bertha
第二個表包含CustomerID來自表 1 的LineNBR列,以及我所說的ArbitraryID. 一個客戶只能有一個ArbitraryID,但可以有幾個LineNBRs:
CREATE TABLE #CustomerTable2
(
CustomerIDFromTable1 varchar(25),
LineNBR VARCHAR(25),
ArbitraryID VARCHAR(25)
)
INSERT INTO #CustomerTable2
VALUES ('0156', '1', '167483'), ('0156', '2', NULL),
('0156', '3', NULL), ('0156', '4', NULL),
('0178', '1', NULL), ('0178', '2', '873923'),
('0178', '3', NULL), ('0178', '4', NULL),
('0908', '1', NULL), ('0908', '2', NULL),
('0908', '2', NULL), ('0908', '4', NULL),
('0785', '1', NULL), ('0785', '2', NULL),
('0785', '3', NULL), ('0785', '4', NULL)
CustomerIDFromTable1 LineNBR ArbitraryID
-------------------------------------------
0156 1 167483
0156 2 NULL
0156 3 NULL
0156 4 NULL
0178 1 NULL
0178 2 873923
0178 3 NULL
0178 4 NULL
0908 1 NULL
0908 2 NULL
0908 3 NULL
0908 4 NULL
0785 1 NULL
0785 2 NULL
0785 3 NULL
0785 4 NULL
第三個表包含表 2 中的任何內容以及我標記ArbitraryID的附加內容。每個只能有一個:IDOtherIDOtherIDArbitraryID
CREATE TABLE #CustomerTable3
(
ArbitraryIDFromTable2 VARCHAR(25),
OtherID VARCHAR(25)
)
INSERT INTO #CustomerTable3
VALUES ('167483', '89987648'), ('873923', '45564783')
ArbitraryIDFromTable2 OtherID
---------------------------------
167483 89987648
873923 45564783
我的問題是這樣的:
如何加入這三個表以確保在表 2 中為具有非空 ArbitraryID 的 CustomerID 獲取存在的 OtherID?
結果應如下所示:
CustomerID CustomerName OtherIDFromTable3
--------------------------------------------------
0156 Frank 89987648
0178 Darrull 873923
0908 Mary NULL
0785 Bertha NULL
我已經開始這樣做了,但是我得到了重復,當然:
SELECT DISTINCT
a.CustomerID AS CustomerIDFinal,
a.CustomerName,
c.OtherID
FROM
#CustomerTable1 a
LEFT OUTER JOIN
#CustomerTable2 b ON a.CustomerID = b.CustomerIDFromTable1
LEFT OUTER JOIN
#CustomerTable3 c ON c.ArbitraryIDFromTable2 = b.ArbitraryID
編輯!只是出于好奇,想知道是否有人可以使用#CustomerTable2 的更新版本來解決
CREATE TABLE #CustomerTable2
( CustomerIDFromTable1 varchar(25),
LineNBR VARCHAR(25),
ArbitraryID VARCHAR(25))
INSERT INTO #CustomerTable2 VALUES
('0156', '1', '167483'), ('0156', '2', '167483'),
('0156', '3', '167483'), ('0156', '4', '167483'),
('0178', '1', '873923'), ('0178', '2', '873923'),
('0178', '3', '873923'), ('0178', '4', NULL),
('0908', '1', NULL), ('0908', '2', NULL),
('0908', '2', NULL), ('0908', '4', NULL),
('0785', '1', NULL), ('0785', '2', NULL),
('0785', '3', NULL), ('0785', '4', NULL)
uj5u.com熱心網友回復:
如果您實際上不需要連接(并且只需要表 3 中的列),那么一種方法是只為該列放置一個子查詢:
SELECT
a.CustomerID AS CustomerIDFinal
,a.CustomerName
,(SELECT c.OtherId FROM #CustomerTable3 c INNER JOIN #CustomerTable2 b ON c.ArbitraryIDFromTable2 = b.ArbitraryID WHERE a.CustomerID = b.CustomerIDFromTable1) OtherId
FROM #CustomerTable1 a
通過加入,您可能想要類似的東西:
SELECT
a.CustomerID AS CustomerIDFinal
,a.CustomerName
,d.OtherID
FROM #CustomerTable1 a
LEFT OUTER JOIN
(
SELECT c.OtherId, b.CustomerIDFromTable1
FROM #CustomerTable3 c INNER JOIN #CustomerTable2 b
ON c.ArbitraryIDFromTable2 = b.ArbitraryID
) d
ON a.CustomerID = d.CustomerIDFromTable1
這是同樣的想法。您inner join在表 2 和表 3 之間使用 a (消除了您看到的“重復”,但在表 1 中使用 a left join,因為并非表 1 中的每條記錄都與表 3 中的記錄匹配。
這是它的小提琴,可以提供您想要的輸出。
為更新的問題添加:如果有多個匹配項,您不會說出您想要的值,但如果您不關心,您關心使用MAX如下:
SELECT
a.CustomerID AS CustomerIDFinal
,a.CustomerName
,(SELECT max(c.OtherId) FROM #CustomerTable3 c INNER JOIN
#CustomerTable2 b ON c.ArbitraryIDFromTable2 = b.ArbitraryID WHERE a.CustomerID = b.CustomerIDFromTable1) OtherId
FROM #CustomerTable1 a
如果您關心的特定行很重要,您可以使用聚合函式,max或者您可以合并一個row_number() OVER (ORDER BY line_nr)子句(或類似性質的東西)。
uj5u.com熱心網友回復:
在創建表第二和第三表時,應包括 FOREIGN KEY,以便它們可以連接。嘗試更改您的表并添加 FOREIGN KEY。
ALTER TABLE Orders
ADD FOREIGN KEY (PersonID) REFERENCES Persons(PersonID);
https://www.w3schools.com/sql/sql_foreignkey.asp
uj5u.com熱心網友回復:
作為行號表(表 2)的結果,您將獲得笛卡爾結果/產品,其中每個客戶有更多條目。基本上,您需要做的是通過 ID 和 NOT NULL 的 Abritrary ID 對 table2 進行左連接,然后左連接繼續到第三個表。
select DISTINCT
t1.CustomerID,
t1.CustomerName,
t3.OtherID
from
#CustomerTable1 t1
LEFT JOIN #CustomerTable2 t2
on t1.CustomerID = t2.CustomerIDFromTable1
AND NOT t2.ArbitraryID IS NULL
LEFT JOIN #CustomerTable3 t3
on t2.ArbitraryID = t3.ArbitraryIDFromTable2
由于您的規則表明表 2 每個客戶只能有一個 ArbitraryID 實體,因此添加
AND NOT t2.ArbitraryID IS NULL
意味著我只想查看那些確實具有任意 ID 的人。然后最終將其加入到表 3 中以獲得最終的 OtherID 值
修訂基于評論。我添加了行號,即使沒有明確要求它只是為了顯示哪個記錄的背景關系如何限定連接。
為了限定相似的結果,您更改了規則,即第二個表將只有一個具有任意 ID 的條目,但您的 NEW 樣本資料對于具有相同任意 ID 的單個客戶具有多行。為了處理,我洗掉了 LineNBR 列并添加了 DISTINCT。Distinct 防止任何回傳的列重復,從而忽略每個客戶分配了任意 ID 的額外行。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/461150.html
