单个查询中单个SQL Server表的条件SELECT / JOIN?

时间:2011-11-15 18:25:39

标签: sql-server select conditional

即使在搜索之后,我也在努力使用正确类型的条件选择语句。

我有一个用户表。有些是业主,有些只是客人,如下:

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...

我正在尝试获取一个查询语句,该语句会导致Bob,Susan和Charles记录显示每个记录的目录名称,如下所示:

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

换句话说,Bob和Susan是Charles的客人,但Charles的记录包含我想要的目录名。希望我的问题有道理吗?

编辑:我应该提到这个转折....我不知道目录名称,只是一个用户ID(例如Bob的1)并且我正在尝试检索正确的目录名称为每个用户关联,无论他们是否是客人。只有所有者记录填写了目录名称。

4 个答案:

答案 0 :(得分:4)

您需要自己加入表格并决定使用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 :(得分:1)

以下数据的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'

答案 2 :(得分:1)

我修改了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 <> ''

答案 3 :(得分:0)

只是采用不同的方式......正如评论中指出的那样,如果用户可以成为所有者和客户,这不起作用我只需要更好地理解数据来调整它。 / p>

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

这基本上是说所有与所有者有关联的人,包括所有者,忽略了从属关系没有定义目录的情况。但是,如果所有者在表格中列出不止一次......我可能会遇到此查询的问题。