2016-03-14 3 views
0

У меня есть стол автораВыберите * из таблицы, используя данные конкретной записи в таблице

| au_id | au_fname | au_lname | город | состояние |

, что я пытаюсь сделать, это получить запрос о первых и последних имен, основанных на том, кто живет в том же состоянии, как Sarah

Вот что я до сих пор:

SELECT AU_FNAME, AU_LNAME FROM authors WHERE "STATE" like 'CA' 

Я не» t хочу использовать статическое состояние в моем коде, я хочу, чтобы он был основан на выбранном человеке - Сара в этом случае.

Благодаря

ответ

2

Используйте Sub-Query, чтобы найти состояние Sarah и фильтр, который state

Попробуйте

SELECT AU_FNAME, AU_LNAME 
FROM authors 
WHERE STATE in (select state from authors where au_fname = 'Sarah') 
+0

Вау, спасибо, что это здорово, и это сработало! и теперь я знаю о подзапросах! – bigSerg

0
SELECT AU_FNAME, AU_LNAME FROM authors WHERE STATE in (select state from authors where au_fname = 'sarah') 

или

select a1.AU_FNAME, a1.AU_LNAME FROM authors a1 
inner join authors a2 on a1.state = a2.state 
where a2.au_fname = 'sarah' 
+0

Второй запрос возвращает дубликаты, если в состоянии есть несколько Sarahs. – jarlh

0

Если есть только один «Сара», то лучше использовать =, а не in:

select a.AU_FNAME, a.AU_LNAME 
from authors a 
where a.state = (select a2.state from authors a2 where a2.au_fname = 'Sarah'); 

Конечно, если не может быть больше, чем одна Сара, то in требуется. Но = часто имеет лучшую производительность, потому что движок базы данных знает, чтобы искать одно значение.

+0

Благодарим вас за полезную информацию! Это маленький дБ, поэтому есть только одна Сара, спасибо. – bigSerg

0

Вопрос определен немного неопределенно, поэтому, основываясь на квалифицированной догадке, кажется, требуется решение для извлечения строк данных (содержащих либо ВСЕ поля данных, то есть SELECT * в соответствии с заголовком, либо просто имена и фамилии как за описание, т. е. SELECT AU_FNAME, AU_LNAME) для states, относящихся к некоторому au_fname (например, Сара), переданному в качестве параметра SQL-запроса. В наиболее общем случае может быть несколько разных авторов с с таким же именем связано с несколько разных состояний. Исходя из этого предположения, запрос/суб-запрос может выглядеть

SELECT * FROM authors 
WHERE STATE IN (SELECT [state] from authors WHERE au_fname = @afname) 

Точный синтаксис может зависеть от специфики базы данных, используемых в растворе.

0

Внутреннее соединение было бы моим первым выбором по подзапросу ... некоторые двигатели db имеют низкую производительность с подзапросами (на ум приходят более старые версии MySQL), но практически любой двигатель должен быть оптимизирован для внутреннего соединения:

SELECT a1.AU_FNAME, a1.AU_LNAME 
FROM Authors AS a1 
INNER JOIN Authors AS a2 ON a1.state = a2.state 
WHERE a2.au_fname = 'sarah' 
GROUP BY a1.AU_FNAME, a1.AU_LNAME; 
+0

Возвращает дубликаты, если в состоянии есть несколько Sarahs. – jarlh

+0

@jarlh - так делают все остальные, кроме Гордона, который выбирает первое состояние, которое он видит по умолчанию. Добавьте группу, если вы хотите, чтобы возвращались только отдельные имена/фамилии.Соответственно обновляется ответ. – jleach

+0

Ответы MotoGP нет. (И что GROUP BY может удалить действительные дубликаты, т. Е. Дубликаты авторов ...) – jarlh

Смежные вопросы