如果条件满足,则从另一个表

时间:2015-07-08 13:15:44

标签: sql sql-server join

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

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

如果Table1Mapping表和master存在相关数据,我希望从Table 1获取数据。

Table 1会很常见。

例如:

表1:

ID    Name
1     ABC

Table1Mapping:

Table1ID    Country    Code
1           US         958
2           IND        89

Country     Code
UK          87
US          56
IND         45

用户可以选择多个国家/地区。如果他选择美国和IND,则美国代码应该从Table1Mapping获得,IND应该来自master,因为没有Id 1和US的数据。

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

4 个答案:

答案 0 :(得分:0)

您可以将两个表连接到Table1并使用条件

进行一些操作

基于您的描述的小例子:

contentEdgeInsets

答案 1 :(得分:0)

我不知道你的架构是什么样子的(特别是表格是如何相关的),所以这只是一个黑暗的镜头:

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

答案 2 :(得分:0)

LEFT JOIN到两个表并使用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

当没有匹配的行时,LEFT JOIN将产生NULL值。 COALESCE将在其参数列表中返回第一个非NULL值。

所以效果是如果在Table1Mapping中找到非NULL值,它将被返回,否则将返回MasterTable中的值。

答案 3 :(得分:0)

您没有向我们提供您的架构,因此我创建了幻想数据以显示其外观。

描述: 将2 LEFT JOINS与COALESCE结合使用,它将为您提供非空的第一个元素。

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

你应该关心什么:如果数据在map和master中怎么办?如果数据不在映射中也不在掌握中怎么办(在我的例子中,如果在映射中找不到任何内容并且掌握一个默认值("没有该id的数据"),如果两个表中都存在数据,则值将来自映射表,因为它&#39 ; s是coalesce()中的第一个参数......