2013-02-22 2 views
3

Я пытаюсь добиться этого в более эффективно и элегантноВытащив несколько значений оператора выбора в SQL

SELECT 
    MD.*, 
    (SELECT City FROM PostcodeData WHERE MD.Postcode = Postcode) [City], 
    (SELECT State FROM PostcodeData WHERE MD.Postcode = Postcode) [State], 
    (SELECT Areacode FROM PostcodeData WHERE MD.Postcode = Postcode) [Areacode] 
FROM MemberDetails AS MD 

Я, очевидно, INNER JOIN двух таблиц ON Почтовый индекс, но у меня возникли проблемы, когда MemberDetail.postcode делает не существует в PostcodeData.postcode. В таких случаях я все равно хотел бы выбрать этих членов, но с результатами NULL для City, State и Areacode. Это достигается в текущем запросе, но это очень неэффективно. Любые идеи были бы хорошы. Ура!

ответ

4

Просто использовать LEFT JOIN:

SELECT 
    MD.*, 
    P.City, 
    P.State, 
    P.Areacode 
FROM MemberDetails AS MD 
    LEFT JOIN PostcodeData P ON MD.Postcode = P.Postcode 
+0

Cheers @sgegges, LEFT JOIN был тем, что я был после – Gregology

0

Используйте OUTER JOIN вместо INNER JOIN - это приведет к возврату записей, даже если в таблице соединений нет соответствующих.

Внешние соединения возвращают все строки из по меньшей мере одной из таблиц или представлений, указанных в предложении FROM, если эти строки удовлетворяют любым условиям поиска WHERE или HAVING.

0

Конечно внешнее соединение является ответом? Что-то вроде:

SELECT MD.*, 
IsNull(pc.City,"No city") AS City, 
IsNull(pc.State,"No state") AS State, 
IsNull(pc.AreaCode,"No area code") AS AreaCode 
FROM 
MemberDetails AS MD 
LEFT OUTER JOIN PostCodeData AS pc ON md.PostCode=pc.PostCode 
Смежные вопросы