[英]SQL statement to conditionally select related records
我有一个表,其中包含字段id
(主键)和fid
。 我想获取id
匹配特定值的记录,以及具有相同fid
值的所有相关记录。
我可以做这个:
SELECT * FROM mytable
WHERE fid = (SELECT TOP 1 fid FROM mytable WHERE id = 'somevalue')
但是如果fid
是一个特定值(在我的情况下为空的guid值),我不希望相关记录。
有没有办法在单个SQL语句中执行此操作? 我正在使用SQL Server 2008 R2。
更新:
看到目前为止的答案,我想我可能没有清楚地问过我的问题。 id
和fid
将永远不相等。 可能需要LEFT JOIN
,但我对SQL有点不了解。 我希望将以下两个查询作为单个语句:
SELECT * FROM mytable WHERE id = 'somevalue'
SELECT * FROM mytable WHERE fid =
(SELECT TOP 1 fid FROM mytable
WHERE id = 'somevalue' AND fid != '00000000-0000-0000-0000-000000000000')
根据您的修订,问题似乎是“选择id
具有特定值的所有行,而具有id
所有其他行匹配“ somevalue”且fid
不为null。
以下内容捕获了此逻辑:
SELECT t.*
FROM mytable t left outer join
(SELECT TOP 1 fid
FROM mytable
WHERE id = 'somevalue' AND fid <> '00000000-0000-0000-0000-000000000000'
) t1
on t.fid = t1.fid
WHERE id = 'somevalue' or t1.fid is not null;
由于id
是主键,因此t1
子查询将返回0或1行。 当它返回0行时,您只会得到与'somevalue'
相匹配的原始行。
我认为这是您想要做的:
SELECT *
FROM mytable a
JOIN mytable b ON a.id = b.fid
WHERE a.id = 'somevalue';
这应该返回a中的所有记录(与b中的所有记录(其中a.id = b.fid一起)一起返回),然后进行过滤以仅显示a.id ='somevalue'的记录;
您可以像这样在您的sql语句中添加另一个子句:
SELECT * From mutable
WHERE fid = (SELECT TOP 1 fid FROM mytable WHERE id = 'somevalue'
AND fid != '00000000-0000-0000-0000-000000000000')
如果要多行,请尝试按@zigdawgydawg的建议加入。
我不确定我是否理解您的问题,但我会采取行动。 我想您要问的是,是否可以从一个表中选择id或fid字段等于特定值的所有记录,但是如果要搜索的特定值等于空,则不希望相关字段指导价值。 如果是这样,请按照以下步骤操作:
SELECT
*
FROM
mytable t1
LEFT JOIN
mytable t2 ON (t1.id = t2.fid) AND (t2.fid IS NOT NULL);
这是您要找的东西吗?
也许这就是您所追求的:
select * from mytable
where id = 'somevalue'
or id = (select fid from mytable where id = 'somevalue')
几乎像zigdawgydawg的贡献一样,但略有不同:
SELECT * FROM mytable WHERE fid IN
(SELECT fid FROM mytable WHERE id = 'somevalue' )
AND NOT guid is null;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.