2013-06-28 3 views
2

Это моя таблицей времени поезда таблицей я хочу решение для поезда между станциямиSQL запрос, чтобы найти поезд между станциями

Train Code 
15609 ABC 
15609 XYZ 
15609 PQR 
15609 ADI 
15609 QWE 
15609 XPM 
15609 IND 
15680 ABC 
15680 XYZ 
15680 PQR 
15680 ADI 
15680 QWE 
15680 XPM 
15680 IND 

Для выхода пользователь даст два входа кодов например: ABC и XYZ , и на выходе будет весь номер поезда с кодом ABC и XYZ.

ответ

4

Это должно сделать трюк. Он также должен хорошо работать - никакой JOIN не требуется.

SELECT 
    Train 
FROM 
    dbo.TrainTime 
WHERE 
    Code IN ('ABC', 'XYZ') 
GROUP BY 
    Train 
HAVING 
    Count(DISTINCT Code) = 2 
; 
+0

спасибо человеку, что он идеален, как то, что мне нужно – SD7

+0

Он работает лучше, чем запросы, которые используют 'JOIN'. Есть ли причина, по которой вы ее не выбрали? – ErikE

+0

+1 Я согласен с тем, что ваши ответы заслуживают как минимум еще +. –

-1

Ну, это вполне, может быть, слишком просто:

select distinct [Train] from mytable 
where code = 'ABC' or code = 'XYZ' 

Позвольте мне знать, если я неправильно Somthing.

+0

Он не должен иметь ИЛИ мне нужен оба кода вместе, имеющих общий номер поезда – SD7

+0

О, я вижу, извините. Затем я предлагаю использовать нечто вроде Романа Пекара, предложенное ниже. –

4

Я думаю, что вы хотите что-то вроде этого

select Train from mytable where Code = 'ABC' 
intersect 
select Train from mytable where Code = 'XYZ' 

SQL FIDDLE EXAMPLE

+0

Я смущен, как вопрос, который не будет работать, был выбран и проголосовали больше? Для этого запроса требуется 'JOIN', что необязательно. Сравните [планы выполнения в SQL Fiddle] (http://sqlfiddle.com/#!6/4f345/1)! Я обещаю вам, что на большом столе это будет очень значительная разница. Кроме того, это не может быть легко обобщено на произвольное количество станций - запрос должен сильно изменить длину. – ErikE

+0

Хотя я мог (частично) согласиться на обобщающий запрос, я думаю, что мой запрос немного читабельнее. И производительность зависит от индексов, которые у вас есть на столе. Если вы правильно указали индексы, производительность равна обоим запросам. Я пробовал оба запроса на ~ 200000 строк с индексами и имеет (читает: 12, продолжительность: 0 по моему запросу и читает: 16, продолжительность: 1) на вашем, чтобы он был равным для меня. И я всегда пишу запрос с учетом индексов. Если у вас нет индексов, ваш запрос работает лучше, но сканирование таблицы - это плохая идея на большом количестве строк. –

+0

здесь [SQL Fiddle без индексов] (http://sqlfiddle.com/#!6/0a8ae/4) –