我的表格包含字段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')
答案 0 :(得分:1)
根据您的修订,问题似乎是“选择id
具有特定值的所有行,而id
的所有其他行匹配”somevalue“,fid
为不是空的。
以下内容捕获了这个逻辑:
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'
匹配的原始行。
答案 1 :(得分:0)
我认为这就是你要做的事情:
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'的记录;
答案 2 :(得分:0)
你可以在你的sql语句中添加另一个子句,如下所示:
SELECT * From mutable
WHERE fid = (SELECT TOP 1 fid FROM mytable WHERE id = 'somevalue'
AND fid != '00000000-0000-0000-0000-000000000000')
如果您想要多行,请按照@zigdawgydawg的建议尝试加入。
答案 3 :(得分:0)
我不确定我理解你的问题,但我会抓住它。我想您要问的是,您是否可以从一个表中选择id或fid字段等于特定值的所有记录,但如果您搜索的特定值等于空,则不需要相关字段指导价值。如果是这样,你可以这样做:
SELECT
*
FROM
mytable t1
LEFT JOIN
mytable t2 ON (t1.id = t2.fid) AND (t2.fid IS NOT NULL);
这是你在找什么?
答案 4 :(得分:0)
也许这就是你所追求的:
select * from mytable
where id = 'somevalue'
or id = (select fid from mytable where id = 'somevalue')
答案 5 :(得分:0)
几乎像zigdawgydawg的贡献,但略有不同:
SELECT * FROM mytable WHERE fid IN
(SELECT fid FROM mytable WHERE id = 'somevalue' )
AND NOT guid is null;