3

我有两个通过外键连接的表。在表 A 中,我试图获取时间列中的数据大于或等于表 B 开始列以及时间列中的数据小于或等于表 b 结束列的所有行。我在想内部连接可能适用于此,但是,结果不是我所期望的。它正在返回一些数据,但它们正在重复自己。

这是我所拥有的:

SELECT * FROM columnA
INNER JOIN columnB
ON columnA.time >= columnB.start
OR columnA.time <= columnB.stop

我看错了吗?内部连接是否是收集这些数据的正确方法?

更新:

实际上 tableA 的外键是连接到 tableB 上的主键。无论如何,我这样做了:

SELECT * FROM tableA
INNER JOIN tableB
ON tableA.time >= tableB.start
AND tableA.time <= tableB.stop

我没有做你所做的事情的原因是因为数据已经在数据库中存在几年了,而我最近刚刚添加了带有外键的列。所以该列中还没有任何数据。这就是我查询它的原因,以便我可以知道要使用信息更新哪些列。它将数据返回给我,但也返回了其他不符合要求的数据。

4

5 回答 5

1

您必须使用定义它们关系的 columnName 加入它们,并将条件放在WHERE子句中。(不在ON条款上)

SELECT a.*, b.*
FROM    tableA a
        INNER JOIN tableB b
            ON a.colName = b.colName  -- colName is the column that links 
WHERE   a.`time` >= b.`start` OR      -- both tables.
        a.`time` <= b.`stop`
于 2012-09-19T03:18:07.330 回答
1

您需要使用外键进行加入,然后过滤掉与您的条件不匹配的结果。

Select * from TableA
Inner join TableB on TableA.Key = TableB.Key
Where TableA.time >= TableB.Start
Or TableA.time <= TableB.Stop

作为一项规则,我总是将 W3Schools 的 sql 页面放在手边。这是我可能忘记并需要快速复习的 SQL 函数的最佳快速参考。也是学习的好地方。

于 2012-09-19T03:22:32.580 回答
0
SELECT a.* 
FROM columnA a 
INNER JOIN columnB b ON a.joiningColumn = b.joiningColumn
WHERE a.time >= b.start
OR a.time <= b.stop
于 2012-09-19T03:24:49.743 回答
0

从你的问题...

where the data in the time column is greater than or equal to the table B start column  
  AND  
where the data in the time column is less than or equal to the table b end column

然而你的查询...

columnA.time >= columnB.start  
  OR  
columnA.time <= columnB.stop  

结合其他人的笔记,关于使用外键加入...

SELECT
  *
FROM
  TableA
INNER JOIN
  TableB
    ON  TableA.PK    = TableB.FK
    AND TableA.time >= TableB.start
    AND TableA.time <= TableB.stop 
于 2012-09-19T03:33:04.010 回答
0

我设法通过添加一个 WHERE 来匹配我正在寻找的确切行中的数据来找出解决方案。这是我的解决方案:

SELECT * FROM tableA
INNER JOIN tableB
ON tableA.timetag >= tableB.start
AND tableA.timetag <= tableB.stop
WHERE tableB.id = "1"
于 2012-09-25T03:20:42.277 回答