Sql 如果满足另一个表的其他条件,则连接一个表

Sql 如果满足另一个表的其他条件,则连接一个表,sql,sql-server,join,Sql,Sql Server,Join,我想知道以下条件的SQL查询 我有三个表,table1我想从中获取数据,第二个是Table1Mapping,第三个是master表 如果存在相关数据,我想从Table1Mapping获取数据,而不是从master表和表1获取数据 表1将是常见的 例如: 表1: ID Name 1 ABC 表1映射: Table1ID Country Code 1 US 958 2 IND 89 主人 Countr

我想知道以下条件的SQL查询

我有三个表,
table1
我想从中获取数据,第二个是
Table1Mapping
,第三个是
master

如果存在相关数据,我想从
Table1Mapping
获取数据,而不是从
master
表和
表1
获取数据

表1将是常见的

例如:

表1:

ID    Name
1     ABC
表1映射:

Table1ID    Country    Code
1           US         958
2           IND        89
主人

Country     Code
UK          87
US          56
IND         45
用户可以选择多个国家/地区。如果他选择了US和IND,那么US代码应该从Table1Mapping获取,IND应该从master获取,因为没有Id 1和US的数据


两个表中的代码可能不同。

您可以将两个表都加入到表1中,并对条件进行一些调整

基于您的描述的小示例:

select
 *
from table1 t1
left join Table1Mapping tm on
    t1.id = tm.id
left join Mastertable mt on
    tm.id is null and
    t1.id = mt.id

我不知道您的模式是什么样子的(特别是表是如何关联的),因此这只是一个不确定的事实:

SELECT *
FROM Table1 t
LEFT JOIN Table1Mapping m ON t.ID = m.Table1_ID
INNER JOIN Master s ON COALESCE(m.Master_ID, t.Master_ID) = s.Master_ID

将两个表左连接并使用COALESCE如何

SELECT COALESCE(m.SomeColumn,mt.SomeColumn) AS SomeColumn
FROM Table1 t1
LEFT JOIN Table1Mapping m ON t1.PK=m.FK
LEFT JOIN MasterTable mt ON t1.PK=mt.FK
当没有匹配行时,左联接将生成空值。 合并将返回其参数列表中的第一个非空值


因此,如果在Table1Mapping中发现一个非空值,则会返回该值,否则会返回MasterTable中的值。

您没有向我们提供您的模式,因此我创建了fantasy数据来显示它的样子

说明: 将2个左连接与COALESCE结合使用,这将为您提供第一个不为null的元素

DECLARE @tab1 TABLE
(
    id INT
)

DECLARE @tabMapping TABLE
(
    id INT,
    anycol VARCHAR(100)
)

DECLARE @tabMaster TABLE
(
    id INT,
    anycol VARCHAR(100)
)

INSERT INTO @tab1 (id) VALUES (1),(2),(3),(4),(5),(6)
INSERT INTO @tabMapping (id,anycol) VALUES (1,'a'),(2,'b'),(3,'c')
INSERT INTO @tabMaster (id,anycol) VALUES (3,'c'),(4,'d'),(5,'e')

SELECT  t1.id,
        COALESCE(map.anycol,mas.anycol,'no data for this id')
FROM    @tab1 t1
        LEFT JOIN @tabMapping map ON t1.id = map.id
        LEFT JOIN @tabMaster mas ON t1.id = mas.id

您应该关心的是:如果数据在映射和主数据中,该怎么办?如果数据不在映射或主数据中,该怎么办!(在我的示例中,如果在映射和主控中未找到任何内容,则会显示一个默认值(“此id没有数据”)。如果两个表中都存在数据,则该值将来自映射表,因为它是coalesce()中的第一个参数)…

可能是重复的,我想他可能是在检查属性名,而不是列中的一个值。或者可能是两个查询的联合,一个是WHERE NOT EXISTS(),另一个是WHERE EXISTS(),很遗憾,这是一个很好的例子dark@reaanb:也是在黑暗中拍摄;-)