2015-05-25 1 views
0

Я пытаюсь выполнить запрос, но он не работает так хорошо для меня. Я получил эти таблицы:SQL Query help using UNION или вложенные запросы

create table spelare(
    Spnr char(13), 
    Snamn varchar (20), 
    primary key (Spnr) 
)engine=innodb; 


create table speltillfalle(
    starttid varchar (15), 
    Tnamn varchar (20), 
    Spnr char (13), 
    resultat char (10), 
    primary key (starttid, Tnamn, Spnr), 
    foreign key (Tnamn) references tavling(Tnamn), 
    foreign key (Spnr) references spelare(Spnr) 
)engine=innodb; 

Что я хочу сделать, это матч колонке «» из ООПТ таблицы «spelare» с колонной из ООПТ стола «speltillfalle». Я сделал это, используя этот запрос:

SELECT Spnr FROM spelare UNION SELECT Spnr FROM speltillfalle; 

Это дало мне все значения Spnr, которые совпадали в обеих таблицах. То, что я хотел бы сделать, это то же самое, и добавить еще одно условие. ИТ должен возвращать то же самое, но только если значение столбца «resultat» в таблице «speltillfalle» является «Diskad» для соответствующего совпадающего Spnr.

ответ

5

На основании вашего описания вы просто добавить это как WHERE-условие:

SELECT Spnr FROM spelare 
UNION 
SELECT Spnr FROM speltillfalle 
WHERE resultat = 'Diskad'; 

Или использовать EXISTS:

SELECT Spnr FROM spelare AS s 
WHERE EXISTS 
( 
    SELECT * FROM speltillfalle AS sf 
    WHERE s.Spnr = sf.Spnr 
    AND resultat = 'Diskad' 
); 

Или IN:

SELECT Spnr FROM spelare AS s 
WHERE Spnr IN 
( 
    SELECT Spnr FROM speltillfalle AS sf 
    WHERE resultat = 'Diskad' 
); 

Оба IN и EXSISTS являются более распространенным решением, чем UNION :-)

+0

Спасибо. Я использовал существующий метод. Я забыл упомянуть, что результаты должны отображаться Snamn в таблице spelare. Если бы вы могли просто помочь с этим, было бы благодарно – hamzah

+0

@hamzah: Что значит «быть отображенным Snamn», заказано? Конечно, с помощью «EXISTS» или «IN?» Вы можете показать/использовать все столбцы в SELECT. – dnoeth

+0

С ответом, который вы мне дали, когда все условия выполнены, он дает мне Spnr матча. То, что я хотел бы для этого сделать, вместо этого ТОЛЬКО дать мне Snamn матча – hamzah

2

Использование Exists так:

SELECT Spnr, Snamn 
FROM spelare 
WHERE EXISTS 
(
SELECT 1 
FROM speltillfalle 
WHERE resultat = 'Diskad' 
AND Spnr = spelare.Spnr 
); 
+0

Где находится здесь? Таблица 'speltillfalle' может содержать строку с непревзойденным' Spnr'. –

+0

упс, вы правы. Я перешел к неправильному выводу. следует лучше использовать. Я отредактировал свой ответ. –

+0

Спасибо. Что мне нужно будет добавить, если бы я хотел, чтобы результат отображал Snamn из таблицы spelare? – hamzah

0

Я думаю, что вы хотите join:

select sp.Spnr from spelare sp 
join speltillfalle sf on sp.Spnr = sf.Spnr and sf.resultat = 'Diskad' 
group by sp.Spnr 
+0

, было бы лучше, так как это приведет ко всем столбцам из обеих таблиц, а также, возможно, к дублированным строкам ... –

+0

@ZoharPeled, исправлено, что –

0

, если я правильно понимаю ваш вопрос, то ответ может быть

«выберите a.spnr, b.spnr из spelare a, speltillfalle b, где a.spnr = b.spnr и b.resultat = 'Diskad'"

+0

Привет, в то время как вы отвечаете в основном правильно, соединение излишняя из-за ограничения внешнего ключа. – medveshonok117

0
SELECT s.Spnr 
    FROM spelare as s 
INNER 
    JOIN speltillfalle as sf 
    on s.Spnr=sf.Spnr 
where sf.Spnr = 'Diskad'; 

Как вы применили соединение в обеих этих таблицах, и оно возвращает все сопоставимые записи для столбца Spnr, нам просто нужно добавить еще одно условие, как показано выше, для определения только тех записей whoes value является «Diskad».

+0

Добро пожаловать в stackoverflow. Пожалуйста, прочитайте [ответ]. –

+0

Как упоминалось ранее, объединение является излишним из-за ограничения внешнего ключа на таблице speltillfalle. – medveshonok117

0

В то время как вы просите «ценности ООПТ, которые соответствовали в обеих таблицах» и «матч колонке„ООПТ“из таблицы spelare с колонкой ООПТ из таблицы speltillfalle» Вам не нужен UNION. В моей книге «соответствие» означает, что они присутствуют в обеих таблицах.

колонка на ООПТ speltillfalle определяются как

foreign key (Spnr) references spelare(Spnr) 

Итак, если speltillfalle.Spnr не является нулевым (это может быть потому, что вы не добавили NOT NULL ограничения), конечно, не существует в spelare таблица. В этом случае

SELECT DISTINCT Spnr FROM speltillfalle WHERE resultat = 'Diskad' AND Spnr IS NOT NULL 

делает работу: ценности ООПТ вы получаете от speltillfalle конечно, существуют в spelare таблицы, в связи с ограничением внешнего ключа.