SQL - 避免联盟全部

时间:2017-02-09 22:17:45

标签: sql

我有2个数据库:项目(包含ID和名称)和国家/地区(包含ID和国家/地区名称)。我正在寻找一个查询,列出所有没有国家/地区的项目以及匹配国家/地区的每个项目。例如:

ItemID ItemName
1      Item1
2      Item2

ItemID Country
1      US
1      Canada

期望的输出:

ItemID ItemName Country
1      Item1    NULL
1      Item1    US
1      Item1    Canada
2      Item2    NULL

没有第一行,它只是一个简单的连接:

SELECT
     i.[ItemID]
     ,i.[ItemName]
     ,ic.[Country]
 FROM ItemCountry ic
    INNER JOIN Item i ON ic.ItemID = i.ItemID

然而,我想出的第一条线出现的唯一方法是做一个联盟:

SELECT
     i.[ItemID]
     ,i.[ItemName]
     ,ic.[Country]
 FROM ItemCountry ic
    INNER JOIN Item i ON ic.ItemID = i.ItemID
UNION all
SELECT
     i.[ItemID]
     ,i.[ItemName]
     ,NULL

我想避免联合,因为数据库很大,我计划在我有完整列表后过滤掉一个子集,但我不知道是否可能。

过滤用于选择页面#X上的项目,因此在我拥有完整(有序)列表之前无法完成。

2 个答案:

答案 0 :(得分:0)

将联合作为子查询。

SELECT *
FROM (
        SELECT
             i.[ItemID]
             ,i.[ItemName]
             ,ic.[Country]
        FROM ItemCountry ic
        FULL JOIN Item i ON ic.ItemID = i.ItemID
        UNION all
        SELECT
             i.[ItemID]
             ,i.[ItemName]
             ,NULL
      ) as T
WHERE <something> 
ORDER BY <T.someField>

答案 1 :(得分:0)

一种方法使用INNER JOINUNION ALL

SELECT i.ItemID, i.ItemName, ic.Country
FROM ItemCountry ic JOIN
     Item i
     ON ic.ItemID = i.ItemID
UNION ALL
SELECT i.ItemID, i.ItemName, NULL
FROM Item i;

我认为这是最简单的方法。当FULL JOIN合适时,我不会使用INNER JOIN