我有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上的项目,因此在我拥有完整(有序)列表之前无法完成。
答案 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 JOIN
和UNION 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
。