2015-07-08 2 views
-2
SELECT a.First_Name,b.EMPID,c.Phn 
FROM NAME a,Emp b,Phone c 
WHERE b.Emptype = 'New' 
AND a.First_name,b.Last_name,C.Phn = (SELECT a.First_Name,b.Last_name,c.Phn 
FROM NAME a,Emp b,Phone c 
WHERE b.Emptype = 'Old') 

В принципе, я хочу искать новых клиентов, которые имеют те же детали (имя, фамилия и телефон), что и старые клиенты. Старый клиент может быть преобразован в нового клиента, но его детали сохраняются. Следовательно, единственное, что меняется, это emptype.Запись запроса для нескольких полей с использованием IN

Например. (John McEnroe 47589876 Old), когда конвертируется (John McEnroe 475898876 New) [Имя, Фамилия, Телефон, Emptype]

+6

Фикс запрос использовать надлежащий 'join' синтаксис. Образцы данных и желаемые результаты также помогут. –

+0

Вы создаете кросс-соединения между таблицами, потому что вы вообще не присоединяетесь к ним. Я на 100% уверен, что вы делаете ** не ** этого хотите. –

ответ

0

Чувак, вот запрос, который использует EXISTS. Основное различие между Exists и IN заключается в том, что Exists вызывает использование INDEX, но IN идет как много OR toghether.

SELECT a.First_Name 
    ,b.EMPID 
    ,c.Phn 
FROM NAME a 
    ,Emp b 
    ,Phone c 
WHERE b.Emptype = 'New' 
    AND EXISTS (Select TOP 1 1 FROM 
        NAME x 
        ,Emp y 
        ,Phone z 
       WHERE 
        x.First_Name = a.First_Name 
       AND y.Last_name = b.Last_name 
       AND z.Phn = c.Phn 
       AND y.Emptype = 'Old' 
      ) 

Теперь, глядя на ваш запрос, у вас есть 3 таблицы, не присоединился к toghether (Имя, EMP, телефон), так что вы имеете реальный беспорядок с данными, которые придут в качестве выходного сигнала. Буду, в основном эта формула:

(первая Строка таблицы кол-во) Умножается (второй строки таблицы QTY) Умножается (третья строки таблицы QTY)

означает, что если каждая таблица имеет 100 строк, вы получите это:

100 х 100 х 100 = 1000000 строк в результате (? Ужасная правой)

0
WITH tempTable as (
     SELECT a.First_Name,b.EMPID,c.Phn 
      FROM NAME a,Emp b,Phone c 
      where b.Emptype = 'Old' 
    ) 
select a.First_Name,b.EMPID,c.Phn 
      FROM NAME a,Emp b,Phone c,tempTable t 
      where b.Emptype = 'Old' and a.First_Name = t.First_Name 
       AND b.Last_name = t.Last_name 
       AND c.Phn = t.Phn; 

попробовать это ... или использовать подзапрос ...

0

You может использовать несколько столбцов для IN запроса:

AND (a.First_name,b.Last_name,C.Phn) IN (SELECT a.First_Name,b.Last_name,c.Phn 
             FROM ...) 
Смежные вопросы