2011-11-20 21 views
8

name ve pen iki sütun içeren bir SQL tablonuz table tablonuz var. Her iki sütun da metin dizeleridir.Çok zorlu SQL röportajı (saklı yordamı kullanamazsınız)

name | pen 
---------------  
mike | red 
mike | red 
mike | blue 
mike | green 
steve | red 
steve | yellow 
anton | red 
anton | blue 
anton | green 
anton | black 
alex | black 
alex | green 
alex | yellow 
alex | red 

Kişinin adı giriş argümanı olarak verilir.

Lütfen, belirli bir kalem seti olan kişilerin adlarını döndüren, bir veya daha büyük/daha büyük/daha büyük/daha büyük olan bir SQL ifadesi (saklı bir prosedür değil) yazınız.

Örnekler:

  • girişi: mike
  • çıkışı: anton

Mike sahiptir (kırmızı, mavi, yeşil).
Anton'un daha fazla aygıtı var (kırmızı, mavi, yeşil) + siyah.

  • girişi: steve
  • çıkışı: alex

Steve (kırmızı, sarı) sahiptir.
Alex'in (kırmızı, sarı) + yeşil + siyahı vardır.
Mike, Anton basılmamış - onlar sarı değil.

  • girişi: alex
  • çıkışı:
+0

Karşılama : Eğer kod, XML veya veri örnekleri gönderirseniz, ** lütfen metin düzenleyicideki bu satırları vurgulayın ve güzel bir format ve sözdizimini vurgulamak için editör araç çubuğundaki "kod örnekleri" düğmesine ('{}') tıklayın! –

+1

Bu ** senin ev ödevi mi? Şimdiye kadar ne yaptın? – joaquin

+6

[Bu ilişkisel bölümdür.] (Http://www.simple-talk.com/sql/t-sql-programming/divided-we-stand-the-sql-of-relational-division/) –

cevap

13

Burada tek yönlü (Online Demo), "steve" giriş adını varsayarak bu.

Bu

"sahibi olmadıkları o steve tarafından sahip olunan bir kalem var yok olan tüm kullanıcılar için Looking" olarak adlandırılabilecek edilebilir

SELECT DISTINCT name 
FROM table t1 
WHERE NOT EXISTS (SELECT * 
        FROM table t2 
        WHERE name = 'steve' 
          AND NOT EXISTS (SELECT * 
              FROM table t3 
              WHERE t2.pen = t3.pen 
               AND t1.name = t3.name)) 
AND t1.name <> 'steve' /*Exclude input name from results*/ 

See this article for other techniques

+0

Teşekkürler, Martin , bir tanesinin daha koşul ekleyin: name = 'Alex' VE dEĞİL (tablo t3 t2.pen = t3 GELEN * SEÇ var olduğu tablo t1 MEVCUT dEĞİL DISTINCT isim SEÇ (tablo t2 GELEN * SEÇ .pen VE t1.name = t3.name)) ve <> 'Alex' – user1055108

+0

@ user1055108 Önünüzde! (Zaten eklenmiştir) –

0
Table Format: 

E_NAME E_PEN 
---------------- 
mike green 
mike blue 
mike red 
mike red 
steve red 
steve yellow 
anton red 
anton blue 
anton green 
anton black 
alex black 
alex green 
alex yellow 
alex red 


Query: 



SELECT A.E_NAME, A.E_PEN 
    FROM V_NAME A, V_NAME B 
WHERE TRIM(UPPER(A.E_NAME)) = TRIM(UPPER(B.E_NAME)) 
    AND TRIM(UPPER(A.E_NAME)) != 'MIKE' 
    AND TRIM(UPPER(A.E_PEN)) = TRIM(UPPER(B.E_PEN(+))) 

Procedure to take Input from user: 

CREATE OR REPLACE PROCEDURE E_TEST(I_NAME VARCHAR2) AS 
BEGIN 
    EXECUTE IMMEDIATE 'CREATE TABLE E_TABLE AS 
        SELECT A.E_NAME,A.E_PEN FROM V_NAME A,V_NAME B 
        WHERE TRIM(UPPER(A.E_NAME)) = TRIM(UPPER(B.E_NAME)) 
        AND TRIM(UPPER(A.E_NAME)) != ''' || 
        I_NAME || ''' 
        AND TRIM(UPPER(A.E_PEN))= TRIM(UPPER(B.E_PEN(+)))'; 
END; 

Name: Nikhil Shinde 
E-Mail: [email protected] 
1
with test1 as 
    (select a.name nm, count(distinct a.pen) ct 
     from table a, table b 
    where b.pen = a.pen 
     and b.name = 'anton' 
    group by a.name 
    order by 2 desc), 
    test2 as 
    (select nm name1 
    from test1 
    where ct = (select max(ct) from test1)) 
    select distinct c.name 
    from table c 
    where c.name in (select name1 
         from test2 
         where name1 not in (case 
          when (select count(distinct name1) from test2) > 1 then 
           'anton' 
          else 
           ' ' 
          end)) 
0
declare @t table (name nvarchar(20), pen nvarchar(20)) 
insert into @t (name,pen) 
values('mike','red'), 
('mike','red'), 
('mike','blue'), 
('mike','green'), 
('steve','red'), 
('steve','yellow'), 
('anton','red'), 
('anton','blue'), 
('anton','green'), 
('anton','black'), 
('alex','black'), 
('alex','green'), 
('alex','yellow'), 
('alex','red') 

declare @input nvarchar(20) = 'mike'; 

with cte_input (name, pen) 
as 
(
    select distinct name, pen 
    from @t 
    where name = @input 
) 
, cte_colors (name, matches) 
as 
(
    select name, matches = count(distinct pen) 
    from @t 
    where name != @input  
     and pen in (select pen from cte_input) 
     group by name 
    having count(distinct pen) = (select count(1) from cte_input) 
) 
select t.name 
from @t t 
join cte_colors m on m.name = t.name 
group by t.name, m.matches 
having count(distinct t.pen) > m.matches 
0

Bu çözüm için LEAD analitik işlevini kullanabiliriz.

sorgu alt sorgu

adının altında olduğu sonuçlar verecektir

select next_name from 
(select name, count(pen) CNT, LEAD(name,1) over (order by count(pen)) next_name 
from table 
group by name order by CNT 
) 
where name=input_value; 

olurdu | CNT | next_name

mike | 3 | Steve

steve | 2 | anton

anton | 4 | alex

alex | 4 | (null)

Ardından, çıkış sorgulaması gereken satırı siler ve aradığımız şey next_name'u verir.

0

tablo pratiği oluşturmak (isim, kalem) seçme 'mike', 'kırmızı' birlik seçme 'mikrofonu' insert pratiği ( adı varchar (10), varchar (10)

pens), 'kırmızı' birlik seçme 'mike', 'mavi' birlik 'mikrofonu', 'yeşil' birlik seçme 'steve' seçeneğini 'kırmızı' birlik seçme 'steve', 'sarı' sendika 'anton' seçeneğini , 'mavi' sendika 'anton', 'green' birliği seçin 'anton', 'black' birliği seçin sele ct 'anton', 'kırmızı' birlik seçme 'alex', 'siyah' birlik seçme 'alex', 'yeşil' birlik seçme 'alex', 'sarı' sendika seçme 'alex', 'kırmızı'

select *

update #t 
set Colourcode = 1 where pens = 'black' 
go 
update #t 
set Colourcode = 2 where pens = 'blue' 
go 
update #t 
set Colourcode = 3 where pens = 'green' 
go 
update #t 
set Colourcode = 4 where pens = 'red' 
go 
update #t 
set Colourcode = 5 where pens = 'yellow' 

ayrı Colourcode seçmek pratikten #t içine

#t

/* IMP Kod / güncelleme seti #t sayısı = ( seçme sayımı () name = 'steve' ve Colourcode = 1 ) tekrar ad = 'steve' ve Colourcode = 1

/* Yukarıdaki güncelleme beyanı exected sonra değişiklik Colourcode = 2 ve nerede yayınlanacağını #t gelen ifadesi değişim Colourcode = 3 ve tekrar deyimi ifadesi değişim Colourcode = 4 çalıştırın ve tekrar ifadesi değişim Colourcode = 5 çalıştırın ve tekrar çalıştırın */

/* adı 'alex' için de aynı işlemi uygulayın,' anton 've' mike '*/

/* Aşağıda ise Çözüm */

seçme adı sayı = #t ( #t ayrı numara seçin nerede Colourcode = 3 ve Numarası = 1) StackOverflow

0
Declare @name nvarchar(20) 
set @name = 'steve'; 
with cte_in 
as 
(
select distinct Pen from tblNamePen where Name = @name 
) 

select Name from 
(
select t1.name, count(distinct t1.Pen) ct from tblNamePen t1 
join cte_in inp on t1.Name <> @name 
where t1.pen = inp.Pen 
group by t1.Name 
) a 
where a.ct >= (select count(Pen) from cte_in) 
İlgili konular