Подзапрос SQL Select - PullRequest
       21

Подзапрос SQL Select

2 голосов
/ 16 сентября 2009

Я немного новичок в SQL и столкнулся со следующей проблемой.

У меня есть таблица с информацией о компании, которая присоединяется к таблице контактов с помощью enqID.

В таблице контактов есть 4 различных типа контактов, которые могут иметь или не иметь запись. Они различаются по ctcTypID (1 - 4)

Я хотел бы создать запрос, содержащий все записи о компании и имя контакта для каждого из 4 различных типов контактов, все в одной строке.

Я думал, что смогу сделать это, используя подзапросы для каждого из различных контактов, но я не могу заставить его работать, так как не знаю, как написать предложение select подзапроса, которое ссылается на его родительское предложение select Вы понимаете, о чем я!)

Это вообще возможно? Как я уже говорил, я довольно новичок в SQL, поэтому, пожалуйста, постарайтесь не издеваться слишком много!

Спасибо

Steve

Ответы [ 3 ]

2 голосов
/ 16 сентября 2009

Что-то вроде (при условии, что вы используете SQL Server 2005 и выше - к сожалению, вы не упомянули об этом в своем первоначальном посте):

SELECT 
   c.CompanyName,
   c1.ctcTypID, c1.ContactName,
   c2.ctcTypID, c2.ContactName,
   c3.ctcTypID, c3.ContactName,
   c4.ctcTypID, c4.ContactName
FROM
   CompanyTable c
LEFT OUTER JOIN
   ContactTable c1 ON c.enqID = c1.enqID AND c1.ctcTypID = 1
LEFT OUTER JOIN
   ContactTable c2 ON c.enqID = c2.enqID AND c2.ctcTypID = 2
LEFT OUTER JOIN
   ContactTable c3 ON c.enqID = c3.enqID AND c3.ctcTypID = 3
LEFT OUTER JOIN
   ContactTable c4 ON c.enqID = c4.enqID AND c4.ctcTypID = 4

Вам необходимо использовать ЛЕВЫЕ ВНЕШНИЕ СОЕДИНЕНИЯ, так как может не быть совпадения, и при этом ваш запрос не будет очень быстрым с точки зрения производительности - но, надеюсь, он будет работать.

Марк

0 голосов
/ 09 декабря 2009

Это также должно работать. Предотвращает присоединение к контактной таблице несколько раз.

SELECT 
   CompanyTable.CompanyName,
   MAX(CASE WHEN ContactTable.ctcTypID  = 1 THEN ContactTable.ContactName END) AS ContactName1,
   MAX(CASE WHEN ContactTable.ctcTypID  = 2 THEN ContactTable.ContactName END) AS ContactName2,
   MAX(CASE WHEN ContactTable.ctcTypID  = 3 THEN ContactTable.ContactName END) AS ContactName3,
   MAX(CASE WHEN ContactTable.ctcTypID  = 4 THEN ContactTable.ContactName END) AS ContactName4
FROM CompanyTable,
LEFT JOIN ContactTable 
    ON ContactTable.enqID = CompanyTable.enqID AND ContactTable.ctcTypID  IN (1,2,3,4)
GROUP BY
   CompanyTable.CompanyName
0 голосов
/ 16 сентября 2009

Я думаю, что вы пытаетесь использовать SQL для чего-то, для чего он не предназначен. SQL - это язык, который позволяет вам манипулировать и получать данные, вы пытаетесь использовать SQL для форматирования вывода полученных данных, и я думаю, что вы не должны этого делать:

Вы не должны пытаться форматировать (помещая все контакты в одну строку, например,) данные в SQL. Мой совет: просто используйте самый производительный SQL-запрос для извлечения данных из базы данных и отформатируйте вывод (поместите контакты в одну строку) на другом языке (C #, Delphi, PHP, что бы вы ни использовали для своего приложение).

...