我正在尝试从两个独立的语句中构建一个select语句。
基本上我在表格中有一个名单列表,它们会像这样重复:
Name| Date
John 2014-11-22
John 2013-02-03
Joe 2012-12-12
Jack 2011-11-11
Bob 2010-10-01
Bob 2013-12-22
我需要做一个Select distinct Name from Records
,它会返回John,Joe,Jack,Bob。
然后我想在另一个表上选择Select,然后传入上面返回的行。
SELECT Address, Phone From dbo.Details
WHERE Name = {Values from first SELECT query}
语法有问题。
答案 0 :(得分:4)
SELECT Address, Phone From dbo.Details
WHERE Name IN (SELECT DISTINCT Name FROM Records)
-- OR --
SELECT Address, Phone From dbo.Details D
WHERE EXISTS (SELECT 1 FROM Records R WHERE R.Name = D.Name)
(在大多数RDBMS中,EXISTS资源消耗较少)。
如果要从子查询返回值,则应使用JOIN
SELECT
D.Address,
D.Phone,
R.Name -- For example
FROM
dbo.Details D
INNER JOIN dbo.Records R
ON D.Name = R.Name
SIDENOTE 这些是示例查询,您可能需要对其进行微调以符合您的具体要求。
答案 1 :(得分:1)
您可以使用:
SELECT Address, Phone, name
FROM details
-- "in" is the difference from your first query, needed due to multiple values being returned by the subquery
WHERE name in (
SELECT distinct name
FROM namesTable
)
此外,以下内容应该有效:
SELECT d.Address, d.Phone, n.name
FROM details d
inner join (
select distinct name
from namesTable
) n on d.name = n.name
答案 2 :(得分:1)
所以有两种方法可以做到这一点。一,创建临时表并执行连接(*实际上回想起来,您也可以作为子查询加入到第二个表中,或者如果您使用的是SQL SERVER,则使用类似CTE的内容,但如果您想使用SQL SERVER则需要修改路线应该很明显)
CREATE TEMPORARY TABLE my_table AS
{your first select query};
SELECT Address, Phone From dbo.Details
INNER JOIN my_table AS mt
ON mt.name = dbo.name
另一种选择是使用您的选择查询
执行IN或EXISTS查询SELECT Address, Phone From dbo.Details
WHERE name IN (SELECT name from my_table)
或者,更好(例如SQL Server IN vs. EXISTS Performance),
SELECT Address, Phone From dbo.Details
WHERE EXISTS (SELECT * from my_table WHERE my_table.name = dbo.name)
您可能需要稍微修改语法,具体取决于您使用的是MySQL还是SQL Server(以后不确定)。但这应该让你开始走正确的道路
答案 3 :(得分:0)
这将为您提供姓名,地址和电话号码:
SELECT DISTINCT N.Name, D.Address, D.Phone
FROM dbo.Details D INNER JOIN dbo.Names N ON D.Name = N.Name
答案 4 :(得分:0)
当在where子句中使用非标量的子查询(不返回一个值)时,使用IN,当然只有子查询中的一列:
SELECT Address, Phone
From dbo.Details
WHERE Name IN (Select Name from Table)