Присоединение к таблице со списком - PullRequest
5 голосов
/ 19 января 2012

У меня есть список значений, подобных этому:

("UXT8","U61J","U61W","U62U","X82U","U5NF","U635","U526","28FX")

Я хотел бы иметь возможность извлечь из таблицы, сколько раз каждый из них встречается в поле таблицы, даже если число вхождений равно 0.

То, что я ищу, похоже на

select key_field, count(*) from table
where key_field in ("UXT8","U61J","U61W","U62U","X82U","U5NF","U635","U526","28FX")
group by key_field;

, но с эффектом левого соединения.

Возможно ли это в sql, а в частности в его вариантах sqlite или mysql?

Спасибо

Ответы [ 5 ]

2 голосов
/ 19 января 2012

Я бы использовал объединение для построения таблицы памяти вместо списка:

select t.code, count(mytable.unique_id) from 
  (
  select 'UXT8' as code union 
  select 'U61J' as code union 
  select 'U61W' as code union 
  select 'U62U' as code union 
  select 'X82U' as code union 
  select 'U5NF' as code union 
  select 'U635' as code union 
  select 'U526' as code union 
  select '28FX' as code
  ) as t 
 left outer join mytable on t.code = mytable.key_field
 group by t.code
 order by t.code;
1 голос
/ 19 января 2012

Этот запрос не выполняется только потому, что он не соответствует ключам с 0, потому что они не существуют.

Итак, сделайте это:

create table #temptable(
  key_field varchar(4)
)

insert into #temptable values ("UXT8"), ("U61J"), ("U61W"), ("U62U"), ("X82U"), ("U5NF"), ("U635"), ("U526"), ("28FX")

и послесловия делают этот выбор:

select a.key_field, case when b.counter is null then 0 else b.counter end as counter from #temptable a
left outer join
(select key_field, count(*) counter from table
where key_field in ("UXT8","U61J","U61W","U62U","X82U","U5NF","U635","U526","28FX")
group by key_field) b on a.key_field = b.keyfield
0 голосов
/ 19 января 2012
SELECT key_field, COALESCE(cnt, 0) as cnt
FROM (
  SELECT 'UXT8' AS key_field UNION ALL
  SELECT 'U61J' AS key_field UNION ALL
  SELECT 'U61W' AS key_field UNION ALL
  SELECT 'U62U' AS key_field UNION ALL
  SELECT 'X82U' AS key_field UNION ALL
  SELECT 'U5NF' AS key_field UNION ALL
  SELECT 'U635' AS key_field UNION ALL
  SELECT 'U526' AS key_field UNION ALL
  SELECT '28FX'    
) as f
LEFT JOIN (
  SELECT key_field, count(*) as cnt
  FROM thetable
  WHERE key_field IN ("UXT8","U61J","U61W",
                      "U62U","X82U","U5NF",
                      "U635","U526","28FX")
  GROUP BY key_field) as cnts
USING (key_field);
0 голосов
/ 19 января 2012

Просто используйте not in, чтобы узнать ключевые_поля, которые не соответствуют никаким значениям из данного списка.

select key_field, count(*) as counter
  from table
 where key_field in ('UXT8','U61J','U61W','U62U','X82U','U5NF','U635','U526','28FX')
 group by key_field

 union all

select key_field, 0 as counter
  from table
 where key_field not in ('UXT8','U61J','U61W','U62U','X82U','U5NF','U635','U526','28FX')
 group by key_field;

Вам нужно только сделать union со вторым запросом, который выглядит как первый, но с оператором not in и счетчиком нуля.

0 голосов
/ 19 января 2012

Нет, вы не можете сделать это в SQL, кроме как в диалектах, которые поддерживают производные таблицы, используя очень уродливый подход, включающий объединение n выборок формы "select 'utx8". Более подходящей альтернативой будетвставить эти значения во временную таблицу и выполнить внешнее соединение с ней.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...