Борьба с запросом SQL - PullRequest
       1

Борьба с запросом SQL

0 голосов
/ 13 февраля 2012

У меня есть таблица с именем транзакции

Transaction:
  User_Id: int
  Transaction_Type: int
  Amount: int

Как запросить всех пользователей, у которых нет типа транзакции 1.

SELECT * FROM Transaction WHERE Transaction_Type <> 1 Group By User_Id

, похоже, возвращает всех пользователей и их типы транзакций, которые не = = 1. Мне нужны все пользователи, которые отсутствуют / не имеют записи типа 1.

Ответы [ 6 ]

4 голосов
/ 13 февраля 2012

Это можно сделать с помощью IN() подзапроса

SELECT DISTINCT User_Id FROM Transaction
WHERE User_Id NOT IN (SELECT DISTINCT User_Id FROM Transaction WHERE Transaction_Type = 1)

Или с NOT EXISTS

SELECT
  DISTINCT User_Id 
FROM Transaction t
WHERE
  NOT EXISTS (SELECT User_Id FROM Transaction tn WHERE Transaction_Type = 1) 
  AND t.User_Id = tn.User_Id
1 голос
/ 13 февраля 2012
SELECT *
FROM    ( SELECT DISTINCT User_Id FROM Transaction ) AS User
LEFT JOIN Transaction ON Transaction.User_Id         = User.id
                     AND Transaction.Transaction_Id != 1
WHERE Transaction.Transaction_Id IS NULL
GROUP BY User.id
1 голос
/ 13 февраля 2012

Возможно, есть более элегантный способ сделать это, но это должно сработать:

SELECT * FROM Transaction WHERE User_Id NOT IN (SELECT User_Id FROM Transaction WHERE Transaction_Type = 1)
0 голосов
/ 14 февраля 2012

Я бы сделал это с JOIN.Предполагая таблицу Users:

SELECT u.*
FROM Users u
LEFT JOIN Transaction t
ON t.User_ID = u.User_ID
AND t.Transaction_Type = 1
WHERE t.User_ID IS NULL

Этот метод позволяет избежать подзапроса и DISTINCT.

0 голосов
/ 13 февраля 2012

Например

SELECT DISTINCT User_Id
FROM [Transaction]
EXCEPT
SELECT User_Id
FROM [Transaction]
WHERE Transaction_Id = 1

Это если у вас нет отдельной таблицы для пользователей. Если вы это сделаете, используйте внешнее соединение.

Я бы предложил не использовать ключевые слова (например, Transaction) в качестве имен таблиц / столбцов

0 голосов
/ 13 февраля 2012
SELECT DISTINCT User_Id
FROM Transaction
WHERE Transaction_Id <> 1
GROUP BY User_Id

Это получает каждый User_Id, в котором есть хотя бы одна транзакция, которая не относится к типу 1. Если вы также хотите, чтобы транзакции были без транзакций, добавьте OR Transaction_Id IS NULL в оператор WHERE.

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