SQL条件INNER JOIN有两个不同的表

时间:2016-01-19 15:23:10

标签: sql inner-join multiple-tables

我有一个应该首先执行的以下简化子查询:

(SELECT app.recordId, left(userid,1) userid, count(*)FROM
      app group by userid,recordId) y

根据此子查询的结果,如果userid='A'我希望INNER加入tableAIf userid='B',我想与tableB进行INNER JOIN。

我还希望显示两个内部联接的结果。有没有办法让我可以在不重新执行子查询的情况下执行此操作以最小化执行时间?

2 个答案:

答案 0 :(得分:1)

一种方法是使用left join两次,可能使用coalesce()

SELECT y.*, COALESCE(a.col1, b.col1) as col1
FROM (SELECT app.recordId, left(userid, 1) as userid, count(*) as cnt
      FROM app
      GROUP BY recordId, left(userid, 1)
     ) y LEFT JOIN
     tableA a
     ON y.userId = 'A' and . . . LEFT JOIN
     tableB b
     ON y.userId = 'B' and . . .
WHERE y.userId IN ('A', 'B');

. . .是其他连接条件的空间,问题未指定。

编辑:

如果要过滤掉没有匹配的行(ala是“内连接”方法):

WHERE y.userId IN ('A', 'B') and not (a.col is null and b.col is null)

其中a.colb.col是用于join条件的两列。

答案 1 :(得分:0)

您没有说明如何处理表A和B中的列。我们也不知道表格是如何相关的。所以我能给你的只是一个例子。

假设你想要一个来自表A或B的描述:

statusMsg.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View view) {
                //Intent intent = new Intent(view.getContext(), MainActivity.class);
// THIS IS WHAT I DID, GET CONTEXT FROM VIEW
                context = view.getContext();

                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
                    final android.content.ClipboardManager clipboardManager = (android.content.ClipboardManager) context
                            .getSystemService(Context.CLIPBOARD_SERVICE);
                    final android.content.ClipData clipData = android.content.ClipData
                            .newPlainText("Copy", statusMsg.getText());
                    clipboardManager.setPrimaryClip(clipData);
                    Toast.makeText(context, "Copied to clipboard", Toast.LENGTH_SHORT).show();

                } else {
                    final android.text.ClipboardManager clipboardManager = (android.text.ClipboardManager) context
                            .getSystemService(Context.CLIPBOARD_SERVICE);
                    clipboardManager.setText(statusMsg.getText());
                    Toast.makeText(context, "Copied to clipboard", Toast.LENGTH_SHORT).show();

                }



                //ClipboardManager cm = (ClipboardManager)context.getSystemService(Context.CLIPBOARD_SERVICE);
                //cm.setText(item.getStatus());
                //Toast.makeText(context, "Copied to clipboard", Toast.LENGTH_SHORT).show();
            }
        });