SQL-запрос, чтобы найти, если существуют разные значения для столбца - PullRequest
2 голосов
/ 25 марта 2009

У меня есть временная таблица с тремя столбцами pay_id, id_client_grp, id_user

По сути, я хочу убедиться, что в этой таблице все строки имеют одинаковую группу клиентов и идентичный id_user, если нет, я хочу узнать, какой pay_id является виновником, и выдать ошибку пользователю.

Может кто-нибудь помочь мне с вопросом.

Спасибо

Риши

Ответы [ 5 ]

1 голос
/ 25 марта 2009

Таким образом, этот вопрос можно задать так:

Если я хотел добавить уникальный индекс в моей таблице по трем столбцам: группа клиентов, идентификатор пользователя, идентификатор платежа, идентифицировать те, которые нарушают уникальное условие, когда у нас есть неуникальный идентификатор оплаты для группы клиентов и идентификатор пользователя?

select a.id_client_grp, a.id_user, a.pay_id , a.count from ( 
/* this should return 1 row per client group and user, */ 
/* if the pay id is the same for all */
 select id_client_grp, id_user, pay_id, count(1) as count
from table t
group by id_client_grp, id_user ) a
group by a.id_client_grp, a.id_user
/* if we have more than one row per client group and user, then we have a dupe, so report them all */
having count (1)  > 1
1 голос
/ 25 марта 2009

Если вы хотите, чтобы все строки имели одинаковые значения для некоторого набора столбцов (ваш вопрос мне не совсем понятен, как и то, что вы хотите быть одинаковым)

Знаете ли вы, в каком поле pay_id, id_client_grp должны быть все строки? Или тебе все равно, пока они все одинаковые?
Если вам известны значения, которые вы ищете, просто проверьте строки, для которых не заданы требуемые значения

Select distinct id_user
From tempTable
Where pay_id <> @PayIdValue 
  Or id_client_grp <> @ClientGroupIDValue

Если вам все равно, и вы хотите, чтобы все они были одинаковыми, а они нет, то вам нужно указать, какой из более чем одного набора значений является «виновником», как вы сказали .. .

Если вы хотите получить ответ на другой вопрос. объясните пожалуйста более четко ...

Затем, основываясь на ваших комментариях, чтобы определить, существует ли более одного id_client_grp, pay_id

Select Count(Distinct id_client_grp, pay_id)
From tempTable

Если это = 1, то каждая запись имеет одинаковые значения для этих 2 полей .... Любое другое значение указывает, что три - это больше, чем один набор различных значений в таблице.

1 голос
/ 25 марта 2009

Когда вы говорите «виновник», я предполагаю, что вы имеете в виду pay_id (s), которые не похожи на другие, при условии, что существует большинство.

Проблема в том, что все pay_id потенциально могут стать виновниками, как только ваш SELECT COUNT (DISTINCT id_client_grp, id_user) вернет> 1 запись, если распределение относительно равномерное. Запрограммировать для этого сценария сложно, так как вам нужно будет определить, какое именно большинство.

Лучше всего будет вернуть все различные комбинации этих 3 полей, а затем решить, куда идти дальше, исходя из вашей бизнес-логики.

0 голосов
/ 25 марта 2009
    SELECT DISTINCT p.pay_id,
        t.[count]
FROM rishi_table p
INNER JOIN ( SELECT id_client_grp, id_user, COUNT(*) As 'count'
                FROM rishi_table
                GROUP BY id_client_grp, id_user
                HAVING COUNT(*) > 1 ) t
    ON p.id_client_grp = t.id_client_grp AND p.id_user = t.id_user

в основном создайте набор с дупсами и добавьте его к главной таблице, чтобы получить список оскорблений.

0 голосов
/ 25 марта 2009

ВЫБРАТЬ DISTINCT id_client_grp, id_user

должен позволить вам сделать что-то вроде

IF @@ ROWCOUNT> 1 THEN

...

Или, возможно, SELECT COUNT (DISTINCT id_client_grp, id_user) ...

но это больше зависит от поставщика в отношении его доступности и правильного синтаксиса.

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