我必须在两个条件下加入两个表.我希望如果第二个条件不成立但表1中有一个空白单元格然后加入该行.如果第二个条件不成立则返回零.
加入表1和表2 - 返回表1和表1中的第3,4和5列.
DECLARE @table1 TABLE (
letter CHAR(1),
num1 INT,
num2 NUMERIC(5,2),
num3 INT,
num4 NUMERIC(5,2)
)
DECLARE @table2 TABLE (
letter CHAR(1),
num1 INT
)
INSERT INTO @table1 VALUES
('A', 1, 0.25, 10, 0.5),
('A', 2, 0.50, 15, 0.75),
('A', 3, 0.25, 20, 1),
('A', null, 0.50, 25, 1.5),
('B', 1, 0.25, 10, 0.5),
('B', 2, 0.50, 15, 0.5),
('B', 3, 0.25, 20, 0.75)
INSERT INTO @table2 VALUES
('A', 1),
('A', 2),
('A', 3),
('A', 5),
('B', 1),
('B', 2),
('B', 3),
('B', 5)
Run Code Online (Sandbox Code Playgroud)
就像是:
SELECT t2.*,
COALESCE(
(SELECT TOP 1 num2, num3, num4 FROM @table1 WHERE letter = t2.letter AND num1 = t2.num1),
(SELECT TOP 1 num2, num3, num4 FROM @table1 WHERE letter = t2.letter AND num1 IS NULL),
0
) AS missing_number
FROM @table2 t2
Run Code Online (Sandbox Code Playgroud)
期望的输出:
(A, 1, 0.25, 10, 0.5),
(A, 2, 0.50, 15, 0.75),
(A, 3, 0.25, 20, 1),
(A, 5, 0.50, 25, 1.5),
(B, 1, 0.25, 10, 0.5),
(B, 2, 0.50, 15, 0.5),
(B, 3, 0.25, 20, 0.75),
(B, 5, 0.00, 0, 0.00)
Run Code Online (Sandbox Code Playgroud)
SELECT t2.*,
COALESCE(t1.num2, t3.num2, 0) AS num2,
COALESCE(t1.num3, t3.num3, 0) AS num3,
COALESCE(t1.num4, t3.num4, 0) AS num4
FROM @table2 t2
LEFT OUTER JOIN @table1 t1 ON t2.letter = t1.letter AND t2.num1 = t1.num1
LEFT OUTER JOIN @table1 t3 ON t2.letter = t3.letter AND t3.num1 IS NULL
Run Code Online (Sandbox Code Playgroud)
在 SQL 中,在表连接期间无法知道当前行是否有一个匹配。当 @table2 中的行与某些列不匹配时,我们无法表达将 @table2 连接到 @table1 中可为 null 的特殊行(其中 @table1.num1 为 null)。需要多个联接。第二个连接基于按列字母和 num1 的正常连接。尝试下面的查询将给出预期的结构。
SELECT *
FROM @table2 t2
LEFT OUTER JOIN @table1 t1 ON t2.letter = t1.letter AND t2.num1 = t1.num1
Run Code Online (Sandbox Code Playgroud)
然后将特殊行与@table2 中的每一行进行匹配。
| 归档时间: |
|
| 查看次数: |
454 次 |
| 最近记录: |