整個代碼是存盤程序的一部分。我有兩段代碼:
SELECT *
FROM eng
FULL JOIN ent ON eng.EntId = ent.EntId
FULL JOIN del ON del.EngId = eng.EngId
FULL JOIN cli ON cli.CId = ent.CId
WHERE eng.[Version] = (SELECT MAX([Version])
FROM eng b
WHERE eng.EngId = b.EngId
AND EntId = @EntId
GROUP BY EngId)
AND ent.[Version] = (SELECT MAX([Version])
FROM ent e
WHERE ent.EntId = e.EntId
AND EntId = @EntId
GROUP BY EntId)
AND ent.EntId = @EntityId
這個作業正常。在線上
eng.[Version] = (SELECT MAX([Version]) FROM eng b ...
這個特定的代碼正在產生輸出:
No Column name
1
2
另一個:
SELECT *
FROM [dbo].[del] D WITH(NOLOCK)
FULL JOIN eng EG WITH(NOLOCK) ON EG.EngId = D.EngId
FULL JOIN [dbo].[ent] E WITH(NOLOCK) ON E.EntId = D.EntId
FULL JOIN [dbo].cli cli ON cli.CliId = E.CliId
WHERE D.[Version] = (SELECT MAX([Version])
FROM del d
WHERE D.DelId = d.DelId
AND EngId = @EngId
GROUP BY DelId)
AND EG.[Version] = (SELECT MAX([Version])
FROM eng eg
WHERE EG.EngId = eg.EngId
AND EngId = @EngId
GROUP BY EngId)
AND E.[Version] = (SELECT MAX([Version])
FROM ent e
WHERE E.EntId = e.EntId
AND EntId = @EntId
GROUP BY EntId)
AND D.EngId = @EngId
這無法正常作業。我收到一個錯誤:
子查詢回傳超過 1 個值
在這條線上
D.[Version] = (SELECT MAX([Version]) FROM del d...
它獨立地產生這個輸出:
No column name
2
1
列名和表名是虛擬的。有人可以幫忙嗎?
編輯
樣本資料
Eng桌子
EngID EntID Entname Version
-------------------------------------
Mana1 333113 name1 1
Mana1 333113 name2 2
Del桌子
DelID EntID EngID Delname Version
-------------------------------------------------
D110 333113 Mana1 delname1 1
D110 333113 Mana1 delname2 2
D111 333113 Mana1 delnewname 1
我需要從這兩個表中提取資料。
這是我需要的輸出:
EntID EngID DelID Entname Delname Version (from del table)
---------------------------------------------------------
333113 Mana1 D110 name2 delname2 2
333113 Mana1 D111 name2 delnewname 1
邏輯是從 eng 表中提取最新版本并將它們映射到 del 表中的行,并在那里找到最新版本。
uj5u.com熱心網友回復:
我認為您typo在以下行中有一個
D.[Version] = (SELECT MAX([Version]) FROM del d WHERE D.DelId=d.DelId AND EngId = @EngId group by DelId)
它在哪里讀WHERE D.DelId=d.DelId
您正在比較同一個表中的同一列,
因此兩個查詢沒有做同樣的事情。
編輯
既然你不相信我,我用你的樣本資料做了一個DBFiddle 。
我有您的查詢,它回傳錯誤,
并且我有查詢,我在其中更改了上面所說的 where 子句,它有效。
EDTI 2
在您詢問這是如何作業的評論中,我將嘗試解釋
您的主查詢有一個名為的別名D
select * FROM [dbo].[del] D
在您的 where 子句中,您有一個子查詢,并且在該子查詢中,您還有一個別名d
FROM del d WHERE D.DelId=d.DelId
放在一起 :
select *
FROM [dbo].[del] D
FULL JOIN eng EG ON EG.EngId = D.EngId
WHERE D.[Version] = (SELECT MAX([Version])
FROM del d
WHERE D.DelId=d.DelId -- I think this is wrong
AND EngId = @EngId
group by DelId
)
因此,您可能期望資料庫從主查詢(別名 D)中獲取 DelID,并將其與子查詢(別名 d)中的 DelId 進行比較。
但這不是正在發生的事情,因為別名 D 和 d 相同,資料庫不會在子查詢中查找值,因為它在子查詢中具有d正確的此處。
您也可以為此撰寫where 1=1
group by 找到 2 個不同的行(使用您的示例資料)并因此回傳 2 個 MAX 值,因此會出現錯誤。
我所做的是給子查詢另一個別名“D2”,這意味著資料庫現在會將 D.DelID 中的值與 D2.DelID 進行比較,這正是您想要的。
我希望這現在很清楚
uj5u.com熱心網友回復:
我沒有遇到任何問題。請提供表格定義和示例資料。
create table eng(Version int, EntId int, EngId int);
create table ent(Version int, EntId int, EngId int, Cid int);
create table del(Version int, EngId int);
create table cli(Version int, CId int);
insert into eng values (1,1,1),(1,1,1);
insert into ent values (1,1,1,1),(1,1,1,1);
insert into del values(1,1),(1,1);
insert into cli values(1,1),(1,1);
GO
DECLARE @EntityID int;
DECLARE @EntID int;
SET @EntityID = 1;
SET @EntID = 1;
SELECT *
FROM eng
FULL JOIN ent ON eng.EntId = ent.EntId
FULL JOIN del ON del.EngId = eng.EngId
FULL JOIN cli ON cli.CId = ent.CId
WHERE eng.[Version] = (SELECT MAX([Version]) FROM eng b WHERE eng.EngId=b.EngId AND EntId =@EntId group by EngId)
AND ent.[Version] = (SELECT MAX([Version]) FROM ent e WHERE ent.EntId=e.EntId AND EntId =@EntId group by EntId)
AND ent.EntId =@EntityId
GO
| 版本 | 物體識別符號 | 英格 | 版本 | 物體識別符號 | 英格 | 西德 | 版本 | 英格 | 版本 | 識別碼 |
|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
| 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
| 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
| 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
| 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
| 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
| 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
| 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
| 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
| 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
| 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
| 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
| 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
| 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
| 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
| 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
db<>在這里擺弄
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/483027.html
下一篇:了解InnoDB死鎖日志
