我正在尝试使用多个OR条件进行左外连接。
declare @table table (ID char(3));
insert into @table values
('001'), ('001'), ('002'), ('003'), ('004')
declare @join_table table (AUX_ID char(3), AUD_ID char(3));
insert into @join_table values
('001', ''),
('002','001'),
('002','003'),
('004','007'),
('005','006')
SELECT a.ID, b.AUX_ID, b.AUD_ID
FROM @table a LEFT JOIN @join_table b
ON a.ID = b.AUX_ID
OR a.ID = b.AUD_ID
使用此代码,我得到:
ID AUX_ID AUD_ID
001 001
001 002 001
001 001
001 002 001
002 002 001
002 002 003
003 002 003
004 004 007
我想要一张原始表中所有ID的列表,以及连接表中匹配的ID。
ID
001
001
002
003
004
007
答案 0 :(得分:0)
您是否尝试匹配条件中的第一项,类似于短路情况?
如果是这样,请尝试使用COALESCE:
SELECT a.ID, b.AUX_ID, b.AUD_ID
FROM @table a LEFT JOIN @join_table b
ON a.ID = COALESCE( b.AUX_ID, b.AUD_ID, '' )
WHERE COALESCE( b.AUX_ID, b.AUD_ID, NULL ) IS NOT NULL
答案 1 :(得分:0)
如果它们存在于任一列中,则返回所有ID:
SELECT distinct a.ID, b1.AUX_ID, b2.AUD_ID
FROM @table a
LEFT JOIN @join_table b1 ON a.ID = b1.AUX_ID
LEFT JOIN @join_table b2 ON a.ID = b2.AUD_ID
答案 2 :(得分:0)
如果您只需要@Table的ID(或其他字段)?
然后你可以在CLAUSE的地方使用EXISTS。
SELECT a.ID
FROM @table a
-- add joins to other tables here
WHERE EXISTS
(
select 1
from @join_table b
where b.AUX_ID is not null
and b.AUD_ID is not null
and a.ID in(b.AUX_ID,b.AUD_ID)
);
答案 3 :(得分:0)
根据评论进行更新。
您的要求 - "不想要明确但又不想重复#34; - 使用" distinct"的标准定义将是矛盾的。和"重复"。所以我们需要的是"复制"的定义。因为你正在使用这个词。
您似乎要说的是ID
在原始@table
中不是唯一的,但是如果每个@table
记录都需要一个结果,它匹配至少一个@join_table
记录。这可以做到,但除非我们没有看到,否则我预计会遇到麻烦。
基本上,当前显示查询的方式,无法唯一地标识来自@table
的行,或者 - 更重要的是 - 告诉哪个@table
行是联接结果集中的行的源。
如果@table
包含构成唯一键的其他记录,则可以将其包含在查询中,以便DISTINCT
不会将它们视为重复项。
如果没有,您可以使用row_number()
创建唯一标识符;但是这个创建的标识符对于查询来说是特殊的,以后不能用于关联回@table
的特定行。也就是说,有几种变化,但这里有一个:
SELECT distinct a.RID, a.ID
FROM (select ID, row_number() over() as R_ID
from @table) as a
LEFT JOIN @join_table b
ON a.ID = b.AUX_ID
OR a.ID = b.AUD_ID
WHERE b.AUX_ID IS NOT NULL OR b.AUD_ID IS NOT NULL
或者如果您真的只想在最终结果中使用ID
,请将其包含在select ID from (
... )
原始回复
所以连接工作正常,但当有多个匹配时,它当然会复制行(就像所有连接一样)。
但实际上问题是,当您需要第一个ID的不同值时,您要求所有ID组合。所以:
SELECT DISTINCT a.ID
FROM @table a LEFT JOIN @join_table b
ON a.ID = b.AUX_ID
OR a.ID = b.AUD_ID
WHERE b.AUX_ID IS NOT NULL OR b.AUD_ID IS NOT NULL
如果您要求提供所需内容,数据库只能提供您想要的内容。