Vis*_*alJ 5 sql sql-server join
我试图加入各种数据集来获得一个主表,虽然我设法保留3个左连接后的行数,但在下一步之后,它似乎增加了它.有什么想法吗?
查询3个连接
-------------------------------------------------------------------
--- STEP 4: ----------------
-------------------------------------------------------------------
SELECT
DISTINCT Table1.[Field1]
, Table1.[Field2]
, Table3.[Field3]
, Table1.[Field4]
, Table1.[Field5]
, Table1.[Field6]
, Table1.[Field7]
, Table1.[Field8]
, Table1.[Field9]
, Table1.[Field10]
FROM db1.dbo.raw_tbl_1 AS Table1
LEFT JOIN db2.dbo.tbl_2 Table2
ON Table1.Field7 = Table2.[Field13]
LEFT JOIN db2.dbo.tbl_3 Table3
ON CONVERT(INT,Table1.[Field2]) = Table3.Field14
LEFT JOIN db2.dbo.tbl_4Table4
ON Table2.Field17= Table4. Field15
WHERE Table2. Field17 IS NOT NULL
-- 2682270 rows (Desired row count)
Run Code Online (Sandbox Code Playgroud)
查询4个连接(增加行数)
-------------------------------------------------------------------
--- STEP 5: ----
-------------------------------------------------------------------
SELECT
DISTINCT Table1.[Field1]
, Table1.[Field2]
, Table3.[Field3]
, Table1.[Field4]
, Table1.[Field5]
, Table1.[Field6]
, Table1.[Field7]
, Table5.[Field11]
, Table6.[Field12]
, Table1.[Field8]
, Table1.[Field9]
, Table1.[Field10]
FROM db1.dbo.raw_tbl_1 AS Table1
LEFT JOIN db2.dbo.tbl_2 Table2
ON Table1.Field7 = Table2.[Field13]
LEFT JOIN db2.dbo.tbl_3 Table3
ON CONVERT(INT,Table1.[Field2]) = Table3. Field14
LEFT JOIN db2.dbo.tbl_4 Table4
ON Table2. Field17= Table4. Field15
LEFT JOIN db2.dbo.tbl_5 Table5
ON Table4. Field18= Table5. Field16
LEFT JOIN db2.dbo.tbl_6 Table6
ON Table5.[Field11] = CONVERT(INT,Table6.[Table6])
WHERE Table2.Field17 IS NOT NULL
Run Code Online (Sandbox Code Playgroud)
如果LEFT JOIN中的一个表具有多个对应值,则它将创建一个新行.如果您不想要此行为,则需要使用聚合函数和GROUP BY.
更具体地说,如果仅使用您加入的最后一个表(导致新行的表)进行查询,您将能够找到重复的行并决定如何处理该行.
由于您提到最后一个连接导致了问题,这意味着Table6返回的行数比您预期的要多.你必须做的事情如下:
SELECT Table5.Field11, COUNT(Table6.Table6) AS row_count
FROM Table5
LEFT JOIN db2.dbo.tbl_6 Table6
ON Table5.[Field11] = CONVERT(INT,Table6.[Table6])
GROUP BY Field11
HAVING row_count > 1
Run Code Online (Sandbox Code Playgroud)
(该HAVING条款假设您期望表之间有1对1的对应关系.如果没有,请将其保留).您必须手动扫描Table6返回的行数超出预期,然后修改查询或相应地删除数据.