Как я могу изменить следующий код, чтобы получить те же результаты с «существует"? (SQL) - PullRequest
0 голосов
/ 15 декабря 2010

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

Это следующий код, который возвращает мне желаемый результат.

 SELECT  DISTINCT Clients.Clients_Code

 FROM         Account 

 INNER JOIN Clients ON Account.Account_Number = Clients.Account_Number 
 INNER JOIN Credit_Card ON Account.Account_Number = Credit_Card.Account_Number 
 INNER JOIN Transactions ON Credit_Card.Credit_Number = Transactions.Credit_Number 
 INNER JOIN Transactions AS Transactions_1 ON Credit_Card.Credit_Number = Transactions_1.Credit_Number 
 INNER JOIN Transactions AS Transactions_2 ON Credit_Card.Credit_Number = Transactions_2.Credit_Number 
 INNER JOIN Transactions AS Transactions_3 ON Credit_Card.Credit_Number = Transactions_3.Credit_Number

 WHERE (Transactions_3.Store_Code = '7182') 
 AND   (Transactions_2.Store_Code = '2019') 
 AND   (Transactions_1.Store_Code = '3121')

СПАСИБО ВСЕМ ЗА ВАШ ОТВЕТ И ОСОБЕННО БЕНДЖАМИН. ЕГО ОТВЕТ РАБОТАЛ ОТЛИЧНО

Ответы [ 4 ]

2 голосов
/ 15 декабря 2010

Из того, что я понял из ваших данных, вы пытаетесь найти клиента, который использовал одну и ту же кредитную карту в трех разных магазинах.Следующий запрос даст те же результаты.

SELECT Clients.Clients_Code
FROM Clients c
INNER JOIN Credit_Card cc ON cc.Account_Number = c.Account_Number
Where Exists(select * from Tranctions t with (nolock) where t.Store_Code = '7182' and t.Credit_Number = cc.Credit_Number) 
AND Exists(select * from Tranctions t with (nolock) where t.Store_Code = '2019' and t.Credit_Number = cc.Credit_Number) 
AND Exists(select * from Tranctions t with (nolock) where t.Store_Code = '3121' and t.Credit_Number = cc.Credit_Number) 

Альтернатива:

SELECT Clients.Clients_Code
FROM Clients c
INNER JOIN Credit_Card cc ON cc.Account_Number = c.Account_Number
Where (select count(*) from Tranctions t with (nolock) where t.Store_Code in ('7182', '2019','3121') and t.Credit_Number = cc.Credit_Number) =3
1 голос
/ 15 декабря 2010

Я сомневаюсь, что вам даже нужна таблица счетов.

Это работает?

SELECT DISTINCT Clients.Clients_Code FROM Clients 
INNER JOIN Credit_Card on Clients.Account_Number = Credit_Card.Account_Number 
WHERE EXISTS ( 
    SELECT null FROM Transactions 
    WHERE Transactions.Credit_Number = Credit_Card.Credit_Number
    AND Transactions.Store_Code in ('7182','2019','3121')
) 
0 голосов
/ 15 декабря 2010

Ваш запрос ... нечетный.

Я думаю, что вы можете достичь тех же результатов с этим запросом:

SELECT DISTINCT c.Clients_Code
FROM Account AS a
INNER JOIN Clients AS c
    ON a.Account_Number = c.Account_Number
INNER JOIN Credit_Card AS cc
    ON a.Account_Number = cc.Account_Number
INNER JOIN Transactions AS t
    ON cc.Credit_Number = t0.Credit_Number
WHERE t.Store_Code IN ('7182', '2019', '3121')

Если вы хотите узнать, существуют ли какие-либо результаты для этого запроса, тогда вы хотите просто обернуть все это в EXISTS ([выше_запрос]).

0 голосов
/ 15 декабря 2010

Я не уверен, что полностью понимаю ваш вопрос. Вы спрашиваете, как этот запрос может возвращать логическое значение, а не фактические записи? Если так:

IF EXISTS (SELECT DISTINCT Clients.Clients_Code
            FROM Account 
            INNER JOIN Clients 
              ON Account.Account_Number = Clients.Account_Number 
            INNER JOIN Credit_Card 
              ON Account.Account_Number = Credit_Card.Account_Number 
            INNER JOIN Transactions 
              ON Credit_Card.Credit_Number = Transactions.Credit_Number 
            INNER JOIN Transactions AS Transactions_1 
              ON Credit_Card.Credit_Number = Transactions_1.Credit_Number 
            INNER JOIN Transactions AS Transactions_2 
              ON Credit_Card.Credit_Number = Transactions_2.Credit_Number 
            INNER JOIN Transactions AS Transactions_3 
              ON Credit_Card.Credit_Number = Transactions_3.Credit_Number
            WHERE (Transactions_3.Store_Code = '7182') 
              AND (Transactions_2.Store_Code = '2019') 
              AND (Transactions_1.Store_Code = '3121'))
   SELECT 1 --True
ELSE
   SELECT 0 --False

Если это не то, чего вы пытаетесь достичь, не могли бы вы уточнить ваш вопрос?

...