我有這些表:
表格1:
Code1 Code2 Code3 Code4 ISCode5
-----------------------------------
xx NULL TEST1 TEST1 1
yy zzz TEST2 TEST2 1
NULL ss TEST3 TEST3 1
NULL aaa TEST4 TEST4 0
表 2:
ID ColTest1 ColTest2 Code1 Code2
-----------------------------------------
1 2 3 xx NULL
1 3 4 yy zzz
2 5 6 NULL ss
2 5 6 NULL aaa
預期輸出:
ID ColTest1 ColTest2 Code1 Code2
------------------------------------------
1 2 3 xx NULL
1 3 4 yy zzz
2 5 6 NULL ss
我需要連接 table1 和 table 2,其中 IsCode5 = 1。但是兩個表都沒有主鍵和外鍵。兩個表唯一的公共列是 Code1 和 Code2。
我試過這個:
SELECT
T2.ID, T2.ColTest1, T2.ColTest2, T2.Code1, T2.Code2
FROM
[dbo].[table2] T2
INNER JOIN
[dbo].[table1] T1 ON T1.Code1 = T2.Code1
AND T1.Code1 = T2.Code2
WHERE
T1.ISCode5 = 1
但它只回傳:
ID ColTest1 ColTest2 Code1 Code2
-----------------------------------------
1 3 4 yy zzz
你有什么想法回傳預期的結果嗎?謝謝。
uj5u.com熱心網友回復:
我認為你只需要OR而不是AND
-- DDL
declare @Table1 table (Code1 varchar(2), Code2 varchar(3), Code3 varchar(5), Code4 varchar(5), ISCode5 bit);
declare @Table2 table (ID int, ColTest1 int, ColTest2 int, Code1 varchar(2), Code2 varchar(3));
-- DML
insert into @Table1 (Code1, Code2, Code3, Code4, ISCode5)
values
('xx', NULL, 'TEST1', 'TEST1', 1),
('yy', 'zzz', 'TEST2', 'TEST2', 1),
(NULL, 'ss', 'TEST3', 'TEST3', 1),
(NULL, 'aaa', 'TEST4', 'TEST4', 0);
insert into @Table2 (ID, ColTest1, ColTest2, Code1, Code2)
values
(1, 2, 3, 'xx', NULL),
(1, 3, 4, 'yy', 'zzz'),
(2, 5, 6, NULL, 'ss'),
(2, 5, 6, NULL, 'aaa');
-- Query
select T2.ID, T2.ColTest1, T2.ColTest2, T1.Code1, T1.Code2
from @Table1 T1
inner join @Table2 T2 on t1.code1 = t2.code1 or t1.code2 = t2.code2 -- <= OR not AND
where ISCode5 = 1;
結果:
| ID | 測驗 1 | ColTest2 | 代碼1 | 代碼2 |
|---|---|---|---|---|
| 1 | 2 | 3 | xx | 空值 |
| 1 | 3 | 4 | 年 | 贊 |
| 2 | 5 | 6 | 空值 | SS |
注意:如果您按此處所示添加 DDL DML,則人們更容易回答。
uj5u.com熱心網友回復:
看來你真正的問題是NULL = NULL從不回傳TRUE,它回傳UNKNOWN,這意味著連接失敗。
有,主要是采用了多項解決這個辦法OR ... IS NULL AND ... IS NULL,但是涉及到了一個非常巧妙的解決方案INTERSECT可用
SELECT *
FROM Table2 t2
WHERE EXISTS (
SELECT t2.Code1, t2.Code2
INTERSECT
SELECT t1.Code1, t1.Code2
FROM Table1 t1
WHERE t1.ISCode5 = 1
);
-- alternately
SELECT t1.*
FROM Table2 t2
JOIN Table1 t1 ON EXISTS (
SELECT t2.Code1, t2.Code2
INTERSECT
SELECT t1.Code1, t1.Code2
)
WHERE t1.ISCode5 = 1;
資料庫<>小提琴
這應該會優化得很好,因為編譯器會識別此構造并將其轉換為IS相等性檢查,如各個地方所述。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/347367.html
標籤:sql sql-server 查询语句
下一篇:在幾年內對多列使用COUNT()
