我需要一条SQL Server Select语句在表之间执行左联接,以便根据右表中的特定值过滤结果.

下面是一个例子: 左表将保存 colored颜色 值.右边的表格将包含左边表格的 colored颜色 组合的行.

tblObject /*this is the left table */
objID    objName
1        Violet
2        Rose 
3        Grass
4        Sky
5        Magenta

tblColorCombination /*this is the right table */
ccID    objID     Color
1       1         Red
2       1         Blue
3       2         Red
4       3         Green
5       4         Blue
6       5         Blue
7       5         Red

SELECT应返回tblColorCombination中具有‘Red’、‘Blue’组合的tblObject行

ccID    obj ID    objName   Color
1       1         Violet    Red
2       1         Violet    Blue
6       5         Magenta   Blue
7       5         Magenta   Red

我try 了这个查询,但未能过滤出正确表中的Rose和Sky

SELECT T1.ccID, T0.objID, T0.objName, T1.Color
FROM tblObject T0
LEFT JOIN tblColorCombination T1 ON T1.objID = T0.objID AND T1.Color IN ('Red', 'Blue')

推荐答案

请注意,LEFT JOIN(以及RIGHT JOIN)在SQL中有特定的含义:它们都指的是OUTER JOIN,在这里不是您想要的.

从您的问题中还不清楚,您是要从tblObject中查找那些既有红色又有蓝色但没有其他记录的记录,还是要查找至少有红色和蓝色的所有记录.如果您想要后者,则以下方法相对简单易懂:

WITH cte AS
(
    SELECT ccRed.ccID AS redID, ccBlue.ccID as blueId, o.objName, 
    ccRed.Color as redColor, ccBlue.Color as blueColor 
    FROM tblObject o
    INNER JOIN tblColorCombination ccRed ON ccRed.objID = o.objID AND ccRed.Color = 'Red'
    INNER JOIN tblColorCombination ccBlue ON ccBlue.objID = o.objID AND ccBlue.Color = 'Blue'
)
SELECT redID as ccID, objName, redColor as Color
FROM cte
UNION
SELECT blueID as ccID, objName, blueColor as Color
FROM cte
ORDER BY 1;

作为解释,CTE通过对同一表的两个内部联接(每个具有不同的额外特征- colored颜色 )来查找同时存在两种 colored颜色 的记录.唯一具有红色和蓝色的记录是满足双重联接的唯一记录.

然后,我们使用SELECT ... UNION SELECT ...将CTE中的组合值拆分回单独的记录.

Sql相关问答推荐

如何用3个(半)固定位置建模团队,并有效地搜索相同/不同的团队?

如何连接第二个表并将其内容输入到第一个表的单个字段中?

有没有办法在每次计算每一行的数据时更新2个值?

Postgres:对包含数字的字符串列表进行排序

如何根据计数和分组获取订单总数

如何查询jsonb列是一个对象数组?

如何隐藏聚合JSON数组元素的键

在Athena中使用regexp提取括号前的字符串值

使用 XML 作为 SQL 表

匹配 H[0-9][0-9] 但不匹配除字母 H 之外的任何字母

我可以在 T-SQL (SQL Server) 的函数内使用 OPTION 子句吗?

如何在 SQL 中将两行(或多行)jsonb 数组合并为一行

PostgreSQL 中将数据从 JSONB 类型转换为 Array 类型

当该日期的至少两条记录具有相同的持续时间或至少一条记录的持续时间为 0 时,如何标记该日期的所有记录

根据潜在空值的条件对记录进行计数

将有效数字作为 varchar 返回的 SQL 函数

使用 regexp_replace 替换所有出现的特殊字符

如何在 PL/SQL 中区分返回的 XML 值?

如何找到特定时间间隔内的最大和最小日期?

聚合 Athena 中的列