Sql 简单连接提供了不必要的行,如何在两个表中仅匹配的情况下正确地获得连接

Sql 简单连接提供了不必要的行,如何在两个表中仅匹配的情况下正确地获得连接,sql,join,Sql,Join,所需输出: Table 1 Field1 Field2 AA 20 AA 20 AB 12 AC 13 Table2 field3 field4 AA 20 AA 20 AC 13 AD 23 AW 21 我用过: newfield field2 field4 AA 20 20 AA 20 20 AC 13 13 这没有给出所需的输出,请让我知道如何获得所需的输出,提前很多次 我不能使用distinct,因为我需要给定的输出,这些不是重复的,这些行的其他列值是不同的更新:好

所需输出:

Table 1
Field1 Field2  
AA 20
AA 20
AB 12
AC 13

Table2
field3 field4
AA 20
AA 20
AC 13
AD 23
AW 21
我用过:

newfield field2 field4
AA   20 20
AA   20 20
AC   13 13
这没有给出所需的输出,请让我知道如何获得所需的输出,提前很多次
我不能使用distinct,因为我需要给定的输出,这些不是重复的,这些行的其他列值是不同的更新:好的,现在我想我知道你想做什么了。您希望第一个表中的每一行最多与第二个表中的一行匹配。如果您使用的是MS SQL、Oracle或PostgreSQL,则可以使用行号来统一行:

 select field1 as newfield, t1.field2,t2.field4
      from table1 t1 join table2 t2 on t1.field1=t2.field3
结果:

SELECT Field1 AS newfield, Field2, field4
FROM (SELECT *, ROW_NUMBER() OVER (PARTITION BY field1 ORDER BY field2) AS rn
     FROM Table1) AS T1
JOIN (SELECT *, ROW_NUMBER() OVER (PARTITION BY field3 ORDER BY field4) AS rn
     FROM Table2) AS T2
ON T1.Field1 = T2.field3 AND T1.rn = T2.rn
ORDER BY Field1
SELECT Field1 AS newfield, Field2, field4
FROM
(SELECT
    Field1,
    Field2,
    @rn := CASE WHEN @last = Field1 THEN @rn + 1 ELSE 1 END AS rn,
    @last := Field1
FROM Table1, (SELECT @rn := 0, @last = NULL) AS vars
ORDER BY Field1) AS T1
JOIN
(SELECT
    Field3,
    Field4,
    @rn := CASE WHEN @last = Field3 THEN @rn + 1 ELSE 1 END AS rn,
    @last := Field3
FROM Table2, (SELECT @rn := 0, @last = NULL) AS vars
ORDER BY Field3) AS T2
ON T1.Field1 = T2.field3 AND T1.rn = T2.rn
ORDER BY Field1
如果您使用的是MySQL,则可以使用变量模拟行数:

'AA', 20, 20
'AA', 20, 20
'AC', 13, 13
结果:

SELECT Field1 AS newfield, Field2, field4
FROM (SELECT *, ROW_NUMBER() OVER (PARTITION BY field1 ORDER BY field2) AS rn
     FROM Table1) AS T1
JOIN (SELECT *, ROW_NUMBER() OVER (PARTITION BY field3 ORDER BY field4) AS rn
     FROM Table2) AS T2
ON T1.Field1 = T2.field3 AND T1.rn = T2.rn
ORDER BY Field1
SELECT Field1 AS newfield, Field2, field4
FROM
(SELECT
    Field1,
    Field2,
    @rn := CASE WHEN @last = Field1 THEN @rn + 1 ELSE 1 END AS rn,
    @last := Field1
FROM Table1, (SELECT @rn := 0, @last = NULL) AS vars
ORDER BY Field1) AS T1
JOIN
(SELECT
    Field3,
    Field4,
    @rn := CASE WHEN @last = Field3 THEN @rn + 1 ELSE 1 END AS rn,
    @last := Field3
FROM Table2, (SELECT @rn := 0, @last = NULL) AS vars
ORDER BY Field3) AS T2
ON T1.Field1 = T2.field3 AND T1.rn = T2.rn
ORDER BY Field1

我猜这就是您所寻找的,但您的数据样本太小,无法真正说明发生了什么:

select * from
(select field1 as newfield, t1.field2,(SELECT DISTINCT field4 from table2 t2 where t1.field1=t2.field3) as field4
      from table1 t1)
      where field4 is not null

为什么数据库中有重复的行?您不喜欢主键吗?您得到的不正确的输出是什么?@OrbMan:他得到的是第一行的四个副本,而不是两个副本。@LS:您使用的是什么数据库?因为您说过其他列可能不同,所以四行是AA的正确数字(1-1,1-2,2-1,2-2)彼得·朗:我第一次尝试也是这样@LS:小心点。。。如果行上有额外数据,此解决方案可能不会达到您的预期效果。哦,我看到我给出的答案与您已经给出的答案相同,只是我保留了
表1
中的行,而您倾向于
表2
。要求还不清楚!好吧,这似乎不必要的复杂。关于这个问题的其他答案似乎更简单。@moleboy:我以前也有过这样的答案,但我认为这不是OP想要的。我想如果表1中有n行,表2中有m行,那么他希望输出中有min(n,m)行,并且每一行只能使用零次或一次(实际表中可能还有其他列)。是的,我现在明白了。是“其他列”造成了我的解决方案的问题。我得到了唯一的连接,仅基于示例数据。其他列会导致问题。但是,正如我在评论OP时所说的,如果需要这个查询,那么你真的不应该以这种方式存储数据(是的,我讨厌别人告诉我这一点,好像我总是有权返回并重新设计数据库……)