SQL在单独的表中基于2个col标准选择行

时间:2018-01-27 20:59:50

标签: sql sql-server

我希望根据另一个表中的值从表中选择一些行: 表1(希望从这里选择) 列日期,名称,支付

表2(包含确定从表1中选择内容的'列表') 列日期,名称

我想写的查询是: 选择日期,名称,从表1中支付,其中日期,名称出现在表2中

我能够在一个值

上做到这一点
SELECT Date,Name,Pay FROM Table1 WHERE Table1.Name IN (Select Table2.name from Table2)

但我坚持如何添加日期限定符。两个表中的名称都不是唯一的,它们的唯一性是日期和名称组合。

3 个答案:

答案 0 :(得分:4)

如果我清楚地理解您的问题,您想申请join

select t1.Date,t1.Name,t1.Pay FROM Table1 t1 inner join Table2 t2 
ON t1.Name = t2.Name and t1.Date = t2.Date

答案 1 :(得分:2)

通用SQL解决方案使用exists

Select Date, Name, Pay
from Table1 t1
where exists (select 1 from table2 t2 where t2.date = t1.date and t2.name = t1.name);

如果它们是NULL,则与表2中的值不匹配。为此,您需要NULL - 安全比较操作。 ANSI标准是is not distinct from

某些数据库支持带有元组的in。在这些数据库中,您可以写:

Select Date, Name, Pay
from Table1 t1
where (t1.date, t1.name) in (select t2.date, t2.name from table2 t2);

再次,这可能会导致NULL值出现问题,具体取决于您希望如何对待它们。

有趣的是,您可以通过使用相关子查询来扩展逻辑:

SELECT Date, Name, Pay
FROM Table1 t1
WHERE t1.Name IN (Select t2.name from Table2 t2 where t2.date = t1.date);

虽然这样做符合你的要求,但我认为前两种方法的意图更为明确。

我应该注意,您可以使用join。但是,如果您在table2中有重复项,则会返回重复值。出于这个原因,我更喜欢existsin方法,因为它们没有重复值的风险。

答案 2 :(得分:1)

您可以使用别名(而不是子查询连接)来更轻松地查看相关表格

SELECT a.Date, a.Name, a.Pay 
FROM Table1 a
inner join  Table2 b on a.name = b.name

在这种情况下,从table1获取日期,如果需要更多,则更改别名或添加两列