【发布时间】:2026-01-20 17:10:01
【问题描述】:
我已经尝试了很多解决方案,但还没有找到一个可以正常工作的解决方案。任何帮助表示赞赏。我正在使用 SQL Server。
我有一些这样的表:
汽车
+-------+-----------------+-----------------+
| CarId | CarImage | CarVideo |
+-------+-----------------+-----------------+
| 1 | http://imageurl | http://videourl |
| 2 | http://imageurl | http://videourl |
| 3 | http://imageurl | http://videourl |
| 4 | http://imageurl | http://videourl |
+-------+-----------------+-----------------+
汽车名称
+----+-------+---------+------------+
| Id | CarId | CarName | LanguageId |
+----+-------+---------+------------+
| 1 | 1 | Car 1 | 1 |
| 2 | 1 | Bil 1 | 2 |
| 3 | 2 | Car 2 | 1 |
| 4 | 2 | Bil 2 | 2 |
| 5 | 3 | Car 3 | 1 |
| 6 | 3 | Bil 3 | 2 |
| 7 | 4 | Car 4 | 1 |
| 8 | 4 | Bil 4 | 2 |
+----+-------+---------+------------+
CARS_NICKS
+--------+--------+-------+---------------------+---------------------+
| NickId | UserId | CarId | CarImage | CarVideo |
+--------+--------+-------+---------------------+---------------------+
| 1 | 1 | 1 | | |
| 2 | 1 | 2 | http://NEW-imageurl | |
| 3 | 1 | 3 | | http://NEW-videourl |
| 4 | 2 | 1 | | http://NEW-videourl |
+--------+--------+-------+---------------------+---------------------+
CARS_NICKS_NAMES
+----+--------+--------------+------------+
| Id | NickId | CarName | LanguageId |
+----+--------+--------------+------------+
| 1 | 1 | Nickname 1 | 1 |
| 2 | 1 | Nicknavn 1 | 2 |
| 3 | 4 | Nickname 1-2 | 1 |
| 4 | 4 | Nicknavn 1-2 | 2 |
| 5 | 2 | Nickname 2 | 1 |
| 6 | 2 | Nicknavn 2 | 2 |
+----+--------+--------------+------------+
我想做的是显示汽车列表,如下所示:
汽车(用于 UserId 1)
+-------+------------+---------------------+---------------------+
| CarId | CarName | CarImage | CarVideo |
+-------+------------+---------------------+---------------------+
| 1 | Nickname 1 | http://imageurl | http://videourl |
| 2 | Nickname 2 | http://NEW-imageurl | http://videourl |
| 3 | Car 3 | http://imageurl | http://NEW-videourl |
| 4 | Car 4 | http://imageurl | http://videourl |
+-------+------------+---------------------+---------------------+
汽车(用于 UserId 2)
+-------+--------------+---------------------+---------------------+
| CarId | CarName | CarImage | CarVideo |
+-------+--------------+---------------------+---------------------+
| 1 | Nickname 1-2 | http://imageurl | http://NEW-videourl |
| 2 | Nickname 2 | http://NEW-imageurl | http://videourl |
| 3 | Car 3 | http://imageurl | http://NEW-videourl |
| 4 | Car 4 | http://imageurl | http://videourl |
+-------+--------------+---------------------+---------------------+
这样做基本上是从 Cars 和 CarNames 表中获取每辆车的所有默认信息。但是,如果 Cars_Nicks 和 Cars_Nicks_Names 表存在,我希望这些数据被覆盖。
在我们的应用程序中,每个用户基本上都有一个“老师”。每个老师的设置也将是每个学生的默认设置,除非学生自己也设置了昵称。所以在这种情况下,UserId 1 是 UserId 2 的“老师”。这就是为什么在 UserId 2 的表中,他们有一些关于 UserId 1 的数据,还有他们自己的昵称,除了默认的 Cars 信息(如果某个数据点)在刻痕中不存在。
我尝试了不同的解决方案来实现这一点,JOIN、UNION、GROUP BY、DISTINCT 以及我能想到的所有组合。但我不断得到多个结果,如下表:
汽车(用于 UserId 2)(我的尝试)
+-------+--------------+---------------------+---------------------+
| CarId | CarName | CarImage | CarVideo |
+-------+--------------+---------------------+---------------------+
| 1 | Nickname 1 | http://imageurl | http://videourl |
| 1 | Nickname 1-2 | http://imageurl | http://NEW-videourl |
| 2 | Nickname 2 | http://NEW-imageurl | http://videourl |
| 2 | Car 2 | http://imageurl | http://videourl |
| 3 | Car 3 | http://imageurl | http://NEW-videourl |
| 3 | Car 3 | http://imageurl | http://videourl |
| 4 | Car 4 | http://imageurl | http://videourl |
+-------+--------------+---------------------+---------------------+
有人知道我怎么能得到这个吗?
这是我的众多尝试之一:
SELECT
CarId,
ISNULL(CarNicks.CarName, CarNames.CarNames) CarNames,
ISNULL(CarNicks.CarImage, Cars.CarImage) CarImage,
ISNULL(CarNicks.CarVideo, Cars.CarVideo) CarVideo
FROM
Cars
LEFT JOIN
(SELECT CarId, CarName, CarImage, CarVideo
FROM Cars_Nicks Nicks
JOIN Cars_Nicks_Names NickNames ON NickNames.NickId = Nicks.NickId
AND NickNames.LanguageId = 1 AND UserId = 1
UNION
SELECT CarId, CarName, CarImage, CarVideo
FROM Cars_Nicks Nicks
JOIN Cars_Nicks_Names NickNames ON NickNames.NickId = Nicks.NickId
AND NickNames.LanguageId = 1 AND UserId = 2) CarNicks ON CarNicks.CarId = Cars.CarId
JOIN
CarNames ON CarNames.CarId = Cars.CarId;
【问题讨论】:
-
感谢格式化链接,我已经更新了。您对我可以使用的查询有什么想法吗?
-
请在代码问题中给出minimal reproducible example--剪切&粘贴&可运行代码;具有期望和实际输出(包括逐字错误消息)的示例输入(作为初始化代码);标签和版本;明确的规范和解释。对于包含最少代码的错误,您可以给出的代码是您显示的代码可以通过您显示的代码扩展为不正常。 (调试基础。)对于包含 DBMS 和 DDL 的 SQL,其中包括约束、索引和表格初始化。
-
当你得到一个你不期望/不理解的结果时,停止试图找到你的总体目标并找出你的误解是什么。--隔离第一个意外/误解的子表达式及其输入 &输出并了解是什么误解、错字、错误推理等导致了它。 (调试基础。)询问一下。 PS“基本上”或“基本上”或“换句话说”,它没有介绍或总结您也给出的清晰、准确和完整的描述,只是意味着“不清楚”。
-
感谢 philipxy,我补充说我正在使用 MSSQL。否则,我相信我已经给出了我的问题的最小可重复示例,以及我拥有的数据
-
我们不能剪切、粘贴和运行——所以不能minimal reproducible example。也没有一个明确的规范,只有一些“基本上”带有模糊的短语——没有minimal reproducible example。另请参阅我的最后一条评论,该评论与您的评论交叉。 PS 在给出业务关系(船舶)/关联或表(基础或查询结果)时,请说出其中的一行根据其列值说明了业务情况。
标签: sql join group-by union distinct