MySQL如果存在则从表中获取,否则使用不同的表

时间:2017-02-11 04:46:41

标签: mysql sql union

我需要在表中选择值= 1的所有IsActive列,但如果另一个表在ItemName列上匹配,我需要从另一个表中获取该行。

示例:table1

--------------------------------------------
  ItemName  |  Cost  |  Price  |  IsActive
--------------------------------------------
  Item1     |  4.50  |   5.00  | 1
--------------------------------------------
  Item2     |  3.00  |  3.50   | 0
--------------------------------------------
  Item3     |  1.75  |  2.40   | 1
--------------------------------------------
  Item4     |  2.55  |  3.05   | 1

示例:table2

--------------------------------------------
  ItemName  |  Cost  |  Price  |  IsActive
--------------------------------------------
  Item1     |  5.50  |   6.70  | 1
--------------------------------------------
  Item8     |  3.00  |  3.50   | 0
--------------------------------------------
  Item8     |  3.50  |  4.50   | 1
--------------------------------------------
  Item3     |  2.75  |  3.40   | 1
--------------------------------------------
  Item5     |  2.60  |  3.90   | 1

结果需要这样:

--------------------------------------------
  ItemName  |  Cost  |  Price  |  IsActive
--------------------------------------------
  Item1     |  5.50  |   6.70  | 1
--------------------------------------------
  Item3     |  2.75  |  3.40   | 1
--------------------------------------------
  Item4     |  2.55  |  3.05   | 1
--------------------------------------------
  Item5     |  2.60  |  3.90   | 1
--------------------------------------------
  Item8     |  3.50  |  4.50   | 1

基本上,如果ItemName存在于table2中,则在IsActive = 1的位置获取它,否则从table1获取它,其中IsActive = 1。

如何在单个MySQL语句中执行此操作?有人能提供一个例子吗?另请注意,table2也可能完全为空。我需要ItemName ASC订购的结果,并且所有IsActive值都需要1,因为这需要在WHERE clause我设置的查询分页集中设置,并且正在使用LIMIT(0,20)也是如此,所以我需要保持分页,所以它需要在1个查询中工作。

这对我来说似乎很基础,但我却在如何简单地处理这个简单的MySQL语句而苦苦挣扎。如果有人可以提供这样的MySQL示例,那么它将优先于SQL,因为2不同并且我需要使用MySQL。

1 个答案:

答案 0 :(得分:1)

您可以像这样使用NOT EXISTS和UNION ALL:

select *
from table1 t1
where isActive = 1
    and not exists (
        select 1
        from table2 t2
        where t1.ItemName = t2.ItemName
            and t2.isActive = 1
        )

union all

select *
from table2 t1
where isActive = 1;

Live demo