Возврат всех значений (включая дубликаты) в SQL - PullRequest
0 голосов
/ 21 декабря 2011

Я не могу вернуть все значения, включая дубликаты, для следующего запроса:

select all field1, count(field1)
from tablename
where
  field2 in (
    abc,
    abc,
    def,
    ghi,
    ghi
  )
group by field1

Существует более 500 значений для field2 (которые являются почтовыми индексами), и я хочу вернуть каждоеfield1 (область), которая назначается каждому field2 (почтовый индекс).Если я выполню приведенный выше запрос, вместо пяти будут возвращены три области (для почтовых индексов abc, def, ghi).Ниже приведена уменьшенная версия таблицы, которую я использую;фактическая таблица имеет ~ 500 строк.

У меня есть список из сотен почтовых индексов (field2), которым назначены все области (field1).Если, например, я введу 400 непонятных почтовых индексов (field2), я хотел бы получить их 400 соответствующих областей (field1).На данный момент я получаю только области, которые соответствуют различным почтовым индексам.

field2 field1
1 66666 север
2 77777 юг
3 88888 восток
4 99999 запад

Я знаю, что есть простое решение, но яозадачен.Я использую MS SQL Server;к сожалению, у меня нет разрешения на создание таблиц в базе данных.

Ответы [ 3 ]

4 голосов
/ 21 декабря 2011

У вас есть две проблемы.

1 - Вы используете GROUP BY, который по определению удаляет повторяющиеся строки в сгруппированных полях (полях)

2 - Выиспользуют IN, которые замыкаются.Это означает, что он игнорирует dupes и просто возвращает логическое значение.

Вы, вероятно, должны попробовать что-то вроде:

CREATE TABLE t_Field2 (field2 varchar(10))
INSERT INTO t_Field2
VALUES
('abc'....) <insert all your rows here>

SELECT Field1, COUNT(Field1)
FROM MyTable t
INNER JOIN t_Field2 t2
ON t2.field2 = t.field2
GROUP BY Field1

An INNER JOIN определенно даст вам dupes в этом сценарии, что по какой-то причинеэто то, что вы хотите, звучит как.

GROUP BY все равно удалит дубликаты Field1 значений.

0 голосов
/ 21 декабря 2011

Я так же озадачен, как и другие, относительно того, что вы пытаетесь сделать, но при условии, что вы пытаетесь предоставить список всех значений (включая дубликаты) и количество раз, которое каждый из них происходит , это можно сделать с помощью

SELECT a.field1, b.CountField
FROM   tablename a 
    INNER JOIN (SELECT Field1, COUNT(*) AS CountField FROM TableName GROUP BY Field1) b
        ON a.Field1=b.Field1

Но я не могу понять, почему вы хотите, чтобы эти данные превышали

SELECT Field1, COUNT(*) AS CountField FROM TableName GROUP BY Field1

Итак, если вы можете уточнить, чего вы пытаетесь достичь, возможно, мы можем помочь больше?

0 голосов
/ 21 декабря 2011

Разве это не только это?

SELECT DISTINCT field1, field2 
  FROM tablename
 WHERE field2 IN ( abc, def, ghi )

Кроме того, ваш исходный запрос имеет предикат IN, в котором по два раза перечисляются «abc» и «ghi». Повторение ничего не делает; field IN ( abc, abc ) логически эквивалентно (field = abc OR field = abc)

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