此查询从两个表中选择ID,其中只有一对一名称匹配
SELECT d.guest_id, h.host_id
FROM `guest` AS g
JOIN `guest_data` AS d
ON d.guest_id = g.guest_id
JOIN host_data AS h
ON d.guest_nm = h.host_nm
GROUP BY
h.venue_nm
HAVING COUNT(*) = 1
现在我无法更新guest
表(g)来设置g.link_id = h.host_id
基本上我想创建一个像
这样的语句UPDATE `guest` AS g , `host` h
SET g.link_id = h.host_id
WHERE g.guest_id = ... AND h.host_id = ... the pairs in the previous statement
答案 0 :(得分:5)
您可能遇到的一个问题是每个guest虚拟机可能有多个host_data行,因此您必须使用聚合函数(我在下面使用max)来获取要从中提取host_id的单行。我更像是一个SQL Server用户,但我认为这种语法与你在MySQL上使用的语法非常接近。这是我的选择:
SELECT g.link_id,
(
SELECT MAX(h.host_id)
FROM guest_data d
INNER JOIN host_data h ON d.guest_nm=hhost_nm
GROUP BY h.venue_nm
HAVING COUNT(*) = 1
) AS x
FROM guest g
WHERE g.guest_id IN
(
SELECT d.guest_id
FROM guest_data d
INNER JOIN host_data h ON d.guest_nm=hhost_nm
GROUP BY h.venue_nm
HAVING COUNT(*) = 1
)
在检查select返回正确的结果集后,您可以轻松地将其转换为UPDATE语句:
UPDATE guest g
SET link_id=
(
SELECT MAX(h.host_id)
FROM guest_data d
INNER JOIN host_data h ON d.guest_nm=hhost_nm
WHERE d.guest_id=g.guest_id
GROUP BY h.venue_nm
HAVING COUNT(*) = 1
)
WHERE g.guest_id IN
(
SELECT d.guest_id
FROM guest_data d
INNER JOIN host_data h ON d.guest_nm=hhost_nm
GROUP BY h.venue_nm
HAVING COUNT(*) = 1
)
我希望这足够接近帮助......
答案 1 :(得分:0)
在Sql Server中,您可以执行类似
的操作更新客人 SET link_id = host_id 来自客人g ...
我从未使用过mysql,所以手指交叉。
答案 2 :(得分:0)
在查看了这个语法之后,我决定拆分操作并使用相同的SELECT查询来INSERT INTO临时表。然后我使用典型的JOIN语法执行UPDATE。
这样做的另一个好处是能够在推送到您的表之前验证查询结果。