11

因此,我的问题涉及三个表,两个常规表和一个连接表,其中一个有很多并且属于很多关系。它们看起来像这样:

table1
--id
--data

table2
--id
--data

table1_table2
--table1_id
--table2_id

所以,我的问题是我将如何查询(使用连接)对于 table1 中的一个项目在 table1_table2 中具有一个或多个值的东西。例如:

Table 1
+----------+
|id | data |
+----------+
|1  | none |
+----------+
|4  | match|
+----------+

Table 2
+----------+
|id | data |
+----------+
|1  | one  |
+----------+
|2  | two  |
+----------+

table1_table2
+----------------------+
|table1_id | table2_id |
+----------------------+
|1         | 1         |
+----------------------+
|4         | 1         |
+----------------------+
|4         | 2         |
+----------------------+

我需要一个与表 1 行 id 4 匹配的查询,因为它有一个通过连接到表 2 中的第 1 行和第 2 行的链接。如果这令人困惑,请提出任何问题。

也许我有点不清楚,我使用 table1_table2 作为连接而不是从。我需要确保它与表 2 中的 1 和 2 匹配。

到目前为止,这是我的查询...

SELECT DISTINCT table1.id,
table2.data

FROM table1

LEFT JOIN table1_table2 ON table1.id = table1_table2.table1_id
LEFT JOIN table2 ON table2.id = table1_table2.table2_id

我需要一个可以使表 1 中的条目匹配表 2 中的 1 和 2 的位置。

我正在寻找的输出是:

+---------------------+
|table1.id|table2.data|
+---------------------+
|4        |one        |
+---------------------+
|4        |two        |
+---------------------+
4

4 回答 4

7

如果您可以保证 Table1_Table2 表中没有重复项,则以下方法有效。也许你可以从这里开始,稍微细化一下。注意 JOIN 条件是如何工作的——将 IN 放在连接条件中与将 IN 条件放在 WHERE 子句中的工作方式不同。

我已经使用哈希标记来表示您需要将代码插入 SQL 中的值。

SELECT Table1.id, COUNT(Table1_Table2.Table2_id)
FROM Table1
JOIN Table1_Table2 ON (Table1_Table2.Table1_id = Table1.id
                   AND Table1_Table2.Table2_id IN (#somelist#))
GROUP BY Table1.id
HAVING COUNT(Table1_Table2.Table2_id) = (#length of somelist#)

糟糕——你已经按照我建议的方式改变了你的问题,我忽略了你的编辑。但这应该可以帮助您入门,因为它会返回您感兴趣的所有 Table1 id。

于 2012-06-04T21:59:20.977 回答
2

这是我的解决方案。它不是很笼统。如果此解决方案不起作用,您应该发表评论,因为它太具体到您的情况。

SELECT DISTINCT Table1.id
FROM Table1
INNER JOIN table1_table2 a ON (table1.id = table1_table2.table1_id
                           AND table2.id = 1)
INNER JOIN table1_table2 b ON (table1.id = table1_table2.table1_id
                           AND table2.id = 2)
于 2012-06-04T21:21:42.260 回答
1

如果我在 SQL Server 中执行此操作,我会将您要检查的值放入临时表(或表变量)中,然后使用 @ChrisCunningham 所说的变体。

CREATE TABLE #temp (Id INT)
INSERT INTO #temp 
VALUES (1, 3, 7)

SELECT a.id AS table1ID, table2.data
FROM
(
       SELECT Table1.id, Table1_Table2.table2_id 
  FROM Table1 JOIN Table1_Table2 
         ON (Table1_Table2.Table1_id = Table1.id                    
  AND Table1_Table2.Table2_id IN (SELECT Id FROM #temp)) 
  GROUP BY Table1.id 
  HAVING COUNT(Table1_Table2.Table2_id) = (SELECT count (*) FROM #temp) 
      ) a
JOIN Table2 ON Table2.id = a.Table2_id 

当然,我不确定 Postgre 对临时表有什么机制,但您甚至可以将其设为存储过程,在其中使用某种拆分函数来创建临时表的值,而不是像我那样。但至少这可能会给你一个想法。

于 2012-06-04T22:20:17.003 回答
0

我认为你应该能够选择这个:

select table1_id, count(*) as count from table1_table2 group by table1_id having count > 2;

分组,计数和拥有是你的朋友!

于 2012-06-04T20:51:53.293 回答