2017-02-09 2 views
0

У меня есть 2 базы данных: элементы (с идентификатором и именем) и страны (с идентификатором и именем страны). Я ищу запрос, в котором перечислены все элементы без пробела страны, а также каждый элемент с соответствующей страной. Пример:SQL - Избегайте союза Все

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

Проблема с объединением заключается в том, что базы данных могут быть большими, и я не хочу расширять их до момента фильтрации. – gvermeer

+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> 
+0

Извините за отсутствие ясности в вопросе: я знаю, как сделать фильтрацию впоследствии. Я стараюсь избегать запуска объединения и перечисления всего, прежде чем делать фильтрацию (базы данных достаточно велики, чтобы это имело значение). – gvermeer

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.

+0

Хороший улов. Я исправлю эту линию. Значит, вы говорите, что не думаете, что есть способ сделать это без СОЮЗА? – gvermeer

Смежные вопросы