我有表 A 和表 B
CREATE TABLE [dbo].[TableA]
(
[ID] Int NULL,
[sk] bigint NULL,
[class] int NULL,
[Values] int NULL,
) ON [PRIMARY]
GO
INSERT INTO [dbo].[TableA] ([ID], [sk], [class], [Values])
VALUES (1, 17734, 5, 66443), (2, 17734, 4, 5456),
(3, 17734, 6, 445645), (4, 17734, 7, 4534),
(5, 16601, 4, 5443), (6, 16601, 7, 453434),
(7, 16601, 8, 76645), (8, 16601, 5, 9875)
CREATE TABLE [dbo].[TableB]
(
[ID] Int NULL,
[sk] bigint NULL,
[class] int NULL,
[Values] int NULL,
) ON [PRIMARY]
GO
INSERT INTO [dbo].[TableB] ([ID], [sk], [class], [Values])
VALUES (1, 17734, 5, 66443), (2, 17734, 4, 5456),
(3, 17734, 6, 445645), (4, 17734, 7, 4534),
(5, 16601, 4, 5443), (6, 16601, 7, 453434),
(7, 16601, 8, 76645), (8, 16601, 5, 9875)
我希望將兩個表與每個表中的所有列連接起來。如果任何記錄不匹配,那么我們需要洗掉所有 SK。
對于 17734 值,兩個表中的所有列都匹配,那么我需要獲取 17734 的值。
對于 16601 值,只有 1 個值不匹配,因此我不想將 16601 的所有值都帶入。
SELECT DISTINCT
DC.[sk],
DC.class,
DC.Values,
DB.class AS DCC,
DB.Values AS DBC
FROM
[dbo].[TableA]
LEFT JOIN
[dbo].[TableA] DB ON DC.[sk] = DB.[sk]
AND DC.class = DB.class
AND DC.Values = DB.Values;
加入后,我得到:
sk class Values class values
--------------------------------
16601 3 65567 NULL NULL
16601 4 5443 4 5443
16601 7 453434 7 453434
16601 8 76645 8 76645
17734 4 5456 4 5456
17734 5 66443 5 66443
17734 6 445645 6 445645
17734 7 4534 7 4534
輸出 :
sk class Values class values
--------------------------------
17734 4 5456 4 5456
17734 5 66443 5 66443
17734 6 445645 6 445645
17734 7 4534 7 4534
uj5u.com熱心網友回復:
使用 CTE:
with table1 as (
select distinct
DC.sk,
DC.class,
DC.Values,
DB.class AS DCC,
DB.Values AS DBC
from [dbo].[TableA]
left join [dbo].[TableB] DB on DC.[sk] = DB.[sk]
and DC.class = DB.class
and DC.Values = DB.Values
)
select *
from table1
where sk not in (select sk from table1 where DCC is null)
您的查詢中有一個錯誤:您正在加入[dbo].[TableA]自己,而不是[dbo].[TableB]
uj5u.com熱心網友回復:
如果你FULL JOIN只在sk&上做 a class。然后您可以通過更改子句
簡單地獲得匹配或不匹配。WHERE
-- -- matching -- SELECT COALESCE(DC.sk, DB.sk) AS sk, COALESCE(DC.class, DB.class) AS class, DC.[Values] AS DC_Values, DB.[Values] AS DB_Values FROM [TableA] DC FULL JOIN [TableB] DB ON DB.sk = DC.sk AND DB.class = DC.class WHERE DB.[Values] = DC.[Values] ORDER BY sk, class;
sk 班級 DC_Values DB_Values 16601 4 5443 5443 16601 7 453434 453434 16601 8 76645 76645 17734 4 5456 5456 17734 5 66443 66443 17734 6 445645 445645 17734 7 4534 4534
-- -- not matching -- SELECT COALESCE(DC.sk, DB.sk) AS sk, COALESCE(DC.class, DB.class) AS class, DC.[Values] AS DC_Values, DB.[Values] AS DB_Values FROM [TableA] DC FULL JOIN [TableB] DB ON DB.sk = DC.sk AND DB.class = DC.class WHERE (DB.[Values] <> DC.[Values] OR DB.[Values] IS NULL OR DC.[Values] IS NULL) ORDER BY sk, class;
sk 班級 DC_Values DB_Values 16601 3 65567 空值 16601 5 空值 9875
關于db<>fiddle的演示在這里
uj5u.com熱心網友回復:
您可以使用EXCEPT運算子來獲得預期的結果。我將逐步解釋我的查詢。
第 1 步:我正在使用except運算子找出不匹配的行:-
SELECT A.sk, A.class, A.[Values] FROM TableA A
EXCEPT
SELECT B.sk, B.class, B.[Values] FROM TableB B
第 2 步:現在我使用以下方法選擇不匹配行的sk :-
SELECT T.sk FROM (query of step 1)T
第 3 步:我使用以下方法從 TableA 中排除那些 sk:-
SELECT * FROM TableA
WHERE sk NOT IN(query of step 2)
所以我們的最終查詢是這樣的:
SELECT * FROM TableA
WHERE sk NOT IN
(
SELECT T.sk FROM
(
SELECT A.sk, A.class, A.[Values] FROM TableA A
EXCEPT
SELECT B.sk, B.class, B.[Values] FROM TableB B
)T
)
uj5u.com熱心網友回復:
當您使用LEFT JOIN查詢時,將從第一個表中獲取所有記錄,并從第二個表中獲取匹配部分。如果您簡單地JOIN使用查詢將只回傳匹配的記錄。
SELECT DISTINCT
DC.[sk],
DC.class,
DC.Values,
DB.class AS DCC,
DB.Values AS DBC
FROM
[dbo].[TableA]
JOIN
[dbo].[TableA] DB ON DC.[sk] = DB.[sk]
AND DC.class = DB.class
AND DC.Values = DB.Values;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/430046.html
上一篇:如何使用案例在同一行中按月、季度和年對銷售額進行分組?
下一篇:SQL選擇每組的第一條記錄
