我希望根据另一个表中的值从表中选择一些行: 表1(希望从这里选择) 列日期,名称,支付
表2(包含确定从表1中选择内容的'列表') 列日期,名称
我想写的查询是: 选择日期,名称,从表1中支付,其中日期,名称出现在表2中
我能够在一个值
上做到这一点SELECT Date,Name,Pay FROM Table1 WHERE Table1.Name IN (Select Table2.name from Table2)
但我坚持如何添加日期限定符。两个表中的名称都不是唯一的,它们的唯一性是日期和名称组合。
答案 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
中有重复项,则会返回重复值。出于这个原因,我更喜欢exists
或in
方法,因为它们没有重复值的风险。
答案 2 :(得分:1)
您可以使用别名(而不是子查询连接)来更轻松地查看相关表格
SELECT a.Date, a.Name, a.Pay
FROM Table1 a
inner join Table2 b on a.name = b.name
在这种情况下,从table1获取日期,如果需要更多,则更改别名或添加两列