Условный SELECT / JOIN из одной таблицы SQL Server в одном запросе? - PullRequest
3 голосов
/ 15 ноября 2011

Я борюсь с правильным типом условного оператора выбора здесь, даже после поиска.

У меня есть таблица с пользователями. Некоторые владельцы, некоторые просто гости, вот так:

TABLE A 
UserID    | UserType | Directory | RegisteredToID | Name
1         | Guest    |           | 3              | Bob
2         | Guest    |           | 3              | Susan
3         | Owner    | abc       | (null)         | Charles
4         | Guest    |           | 20             | Hugh
etc...

Я пытаюсь получить один оператор запроса, который приводит записи Боба, Сьюзен и Чарльза с указанием имени каталога для каждого, например:

Name    | Directory
Bob     | abc
Susan   | abc
Charles | abc

Другими словами, Боб и Сьюзен - гости Чарльза, но запись Чарльза содержит имя каталога, которое я хочу. Надеюсь, мой вопрос имеет смысл?

РЕДАКТИРОВАТЬ: Я должен был упомянуть этот поворот .... Я не буду знать имя каталога, только идентификатор пользователя (например, 1 для Боба), и я пытаюсь получить правильное имя каталога, чтобы связать для каждого пользователя, будь он гостем или нет. Только записи владельца имеют заполненное имя каталога.

Ответы [ 4 ]

4 голосов
/ 15 ноября 2011

Вам нужно самостоятельно присоединиться к таблице и решить с помощью CASE, какой каталог выбрать.

У меня из головы (у меня нет доступа к SQL Server намомент):

SELECT
    t1.Name,
    CASE WHEN t1.RegisteredToID is null
        THEN t1.Directory 
        ELSE t2.Directory 
    END AS Directory
FROM 
    TableA AS t1
LEFT JOIN TableA AS t2 
    ON t1.RegisteredToID = t2.UserID
1 голос
/ 15 ноября 2011

Я изменил ответ JNK, чтобы он работал с любой комбинацией имен каталогов, а не только с 'abc'

SELECT B.name, A.Directory
FROM TableA A
INNER JOIN TableA B
    ON A.UserID = B.RegisteredToID
    OR A.UserID = b.UserID
WHERE A.Directory <> ''
1 голос
/ 15 ноября 2011

Рабочий раствор с CTE для данных ниже:

With TABLEA as(

SELECT 1 as UserID, 'Guest' as UserType, NULL as Directory, 
       3 as RegisteredToID, 'Bob' as Name
UNION ALL
SELECT 2, 'Guest', NULL, 3, 'Susan'
UNION ALL
SELECT 3, 'Owner', 'abc', NULL, 'Charles'
UNION ALL
SELECT 4, 'Guest', NULL, 20, 'Hugh'
)


SELECT B.name, A.Directory
FROM TableA A
INNER JOIN TableA B
    ON A.UserID = B.RegisteredToID
    OR A.UserID = b.UserID
WHERE A.Directory = 'abc'
0 голосов
/ 15 ноября 2011

Просто другой способ сделать это ... как указано в комментариях, это не сработает, если пользователь может быть владельцем и гостем. Мне просто нужно лучше понять данные, чтобы настроить их.

Select B.Name, A.Directory 
from Nova A
INNER JOIN Nova B 
  on A.UserID = B.RegisteredtoID or 
   (B.RegisteredtoID is null AND A.userID=B.userID)
  where a.directory is not null

Это в основном говорит о том, чтобы получить всех людей, связанных с владельцем, включая владельца, игнорируя ситуации, когда для филиала не определен каталог.Однако, если владелец указан в таблице более одного раза ... Вероятно, у меня возникнут проблемы с этим запросом.

...