SELECT中的SQL SELECT

时间:2015-02-03 15:06:22

标签: sql-server

我正在尝试从两个独立的语句中构建一个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}

语法有问题。

5 个答案:

答案 0 :(得分:4)

如果您不想从子查询中返回任何值,可以使用INEXISTS

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)