n00*_*mer 6 mysql sql concat key
假设我有一个名为FISH的mysql表,其中包含字段A,B和C.
我跑SELECT * FROM FISH.这让我看到了所有领域的视图.那么,如果A是原始表中的键,它是视图中的键吗?意思是,如果我有一张桌子FISH2,我跑了
SELECT * FROM (SELECT * FROM FISH) D, (SELECT * FROM FISH2) E WHERE D.A = E.A
Run Code Online (Sandbox Code Playgroud)
相关领域仍然是关键吗?
现在,让我们更进一步.如果我跑
SELECT * FROM (SELECT CONCAT(A,B) AS DUCK, C FROM FISH) D, (SELECT CONCAT(A,B) AS DUCK2, C FROM FISH2) E WHERE D.DUCK = E.DUCK2
Run Code Online (Sandbox Code Playgroud)
如果A和B是原始表中的键,它们的串联是否也是键?
谢谢 :)
如果A是 中的键fish,则仅对鱼进行任何投影都会产生一个结果集,其中 A 仍然是唯一的。
表fish 与任何具有1:1 关系的表(例如fish_type)之间的联接将生成一个结果集,其中A 是唯一的。
与具有来自fish的1:M或M:M关系的另一个表(例如fish_beits)的联接不会产生A是唯一的结果,除非您在“另一”端提供过滤谓词(例如bait='Dynamite')。
SELECT * FROM (SELECT * FROM FISH) D, (SELECT * FROM FISH2) E WHERE D.A = E.A
Run Code Online (Sandbox Code Playgroud)
...逻辑上等价于以下语句,大多数数据库(包括MySQL)都会执行转换:
select *
from fish
join fish2 on(fish.a = fish2.a)
Run Code Online (Sandbox Code Playgroud)
A 在结果集中是否仍然唯一取决于键及其fish2关系(见上文)。
连接不保持唯一性。考虑以下情况:
concat("10", "10") => "1010"
concat("101", "0") => "1010"
Run Code Online (Sandbox Code Playgroud)
因此,您的最终查询...
SELECT *
FROM (SELECT CONCAT(A,B) AS DUCK, C FROM FISH) D
,(SELECT CONCAT(A,B) AS DUCK2, C FROM FISH2) E
WHERE D.DUCK = E.DUCK2
Run Code Online (Sandbox Code Playgroud)
...不会(必然)产生与以下相同的结果
select *
from fish
join fish2 on(
fish.a = fish2.a
and fish.b = fish2.b
)
Run Code Online (Sandbox Code Playgroud)
我之所以这么写,是因为碰撞取决于实际值。大约前一段时间,我发现了一个错误,其根本原因正是如此。在错误出现之前,该代码已经运行了好几年。
| 归档时间: |
|
| 查看次数: |
120 次 |
| 最近记录: |